From 7e3124ce1194fd9571f2bac3e938ce10f261e354 Mon Sep 17 00:00:00 2001 From: Ivan Ignatiev Date: Sun, 17 Mar 2019 10:21:16 +0100 Subject: [PATCH 001/101] Add non-existing options keys to return parameters in Handler::includeOptionsInParams function --- lib/ArangoDBClient/Handler.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/ArangoDBClient/Handler.php b/lib/ArangoDBClient/Handler.php index 965365fe..c1321e69 100644 --- a/lib/ArangoDBClient/Handler.php +++ b/lib/ArangoDBClient/Handler.php @@ -111,6 +111,18 @@ protected function includeOptionsInParams($options, array $includeArray = []) } } + foreach ($includeArray as $key => $value) { + if (!array_key_exists($key, $options)) { + if ($key === ConnectionOptions::OPTION_UPDATE_POLICY) { + UpdatePolicy::validate($value); + } + + if ($value !== null) { + $params[$key] = $value; + } + } + } + return $params; } From 9a7dfea5908aab8195797f45513792d6f11fbee9 Mon Sep 17 00:00:00 2001 From: Ivan Ignatiev Date: Sun, 17 Mar 2019 11:00:18 +0100 Subject: [PATCH 002/101] Fix collection creation options if trying insert new document in non-existing collection --- lib/ArangoDBClient/DocumentHandler.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index e189dc82..23fdf5f3 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -806,6 +806,7 @@ private function getRevision($document) return $revision; } + /** * @param $collection mixed collection name or id * @param array $options - optional, array of options @@ -813,10 +814,12 @@ private function getRevision($document) *
  • 'createCollection' - true to create the collection if it does not exist
  • *
  • 'createCollectionType' - "document" or 2 for document collection
  • *
  • "edge" or 3 for edge collection
  • + *
  • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
  • *

    */ protected function createCollectionIfOptions($collection, $options) { + if (!array_key_exists(CollectionHandler::OPTION_CREATE_COLLECTION, $options)) { return; } @@ -829,18 +832,25 @@ protected function createCollectionIfOptions($collection, $options) $collectionHandler = new CollectionHandler($this->getConnection()); + $params = []; + if (array_key_exists('createCollectionType', $options)) { - $options['type'] = $options['createCollectionType']; - unset($options['createCollectionType']); + $params['type'] = $options['createCollectionType']; + } + + if (array_key_exists('waitForSync', $options)) { + $params['waitForSync'] = $options['waitForSync']; } - unset($options['createCollection']); + try { // attempt to create the collection - $collectionHandler->create($collection, $options); + $collectionHandler->create($collection, $params); } catch (Exception $e) { // collection may have existed already } } } +} + class_alias(DocumentHandler::class, '\triagens\ArangoDb\DocumentHandler'); From f7a58b46067db50d8c6c27c8bc4907b5551d5ac1 Mon Sep 17 00:00:00 2001 From: Ivan Ignatiev Date: Sun, 17 Mar 2019 11:18:13 +0100 Subject: [PATCH 003/101] Add test for inserting a new object without created collection and with connection OPTION_CREATE = true --- tests/DocumentBasicTest.php | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/DocumentBasicTest.php b/tests/DocumentBasicTest.php index b921bea5..c92dd64a 100644 --- a/tests/DocumentBasicTest.php +++ b/tests/DocumentBasicTest.php @@ -197,6 +197,41 @@ public function testCreateAndDeleteDocumentWithoutCreatedCollection() } + /** + * Try to create and delete a document with OPTION_CREATE = true + */ + public function testCreateAndDeleteDocumentWithoutCreatedCollectionAndOptionCreate() + { + $connection = $this->connection; + $document = new Document(); + $documentHandler = new DocumentHandler($connection); + + $options = $connection->getOptions(); + $connection->setOption(ConnectionOptions::OPTION_CREATE, true); + + try { + $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); + } catch (\Exception $e) { + // don't bother us, if it's already deleted. + } + + $document->someAttribute = 'someValue'; + + $documentId = $documentHandler->save('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp, $document); + + $resultingDocument = $documentHandler->get('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp, $documentId); + + $resultingAttribute = $resultingDocument->someAttribute; + static::assertSame('someValue', $resultingAttribute, 'Resulting Attribute should be "someValue". It\'s :' . $resultingAttribute); + + $documentHandler->remove($document); + + $connection->setOption(ConnectionOptions::OPTION_CREATE, $options[ConnectionOptions::OPTION_CREATE]); + + } + + + /** * Try to create and delete a document using a defined key */ From a9fd568df42a9d3aa8e239d54950a3b3f0b85d81 Mon Sep 17 00:00:00 2001 From: Ivan Ignatiev Date: Sun, 17 Mar 2019 11:24:36 +0100 Subject: [PATCH 004/101] Fix typo --- lib/ArangoDBClient/DocumentHandler.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index 23fdf5f3..e2b05fd4 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -849,7 +849,6 @@ protected function createCollectionIfOptions($collection, $options) // collection may have existed already } } -} } From 7a773c195e2dd8c5328753373ce384e77f2b4565 Mon Sep 17 00:00:00 2001 From: Sony AK Date: Thu, 21 Mar 2019 10:04:17 +0700 Subject: [PATCH 005/101] Update README.md --- docs/Drivers/PHP/Tutorial/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Drivers/PHP/Tutorial/README.md b/docs/Drivers/PHP/Tutorial/README.md index bb9b06ec..ac8a1aa7 100644 --- a/docs/Drivers/PHP/Tutorial/README.md +++ b/docs/Drivers/PHP/Tutorial/README.md @@ -277,7 +277,7 @@ object(ArangoDBClient\Document)##6 (4) { */ ``` -Whenever the document id is yet unknown, but you want to fetch a document from the server by any of its other properties, you can use the CollectionHandler->byExample() method. It allows you to provide an example of the document that you are looking for. The example should either be a Document object with the relevant properties set, or, a PHP array with the propeties that you are looking for: +Whenever the document id is yet unknown, but you want to fetch a document from the server by any of its other properties, you can use the CollectionHandler->byExample() method. It allows you to provide an example of the document that you are looking for. The example should either be a Document object with the relevant properties set, or, a PHP array with the properties that you are looking for: ```php // get a document list back from the server, using a document example From 8887998de2776db5c70c3d153fec46f15bb5079b Mon Sep 17 00:00:00 2001 From: Sony AK Date: Tue, 26 Mar 2019 16:39:09 +0700 Subject: [PATCH 006/101] small typo :) --- docs/Drivers/PHP/Tutorial/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Drivers/PHP/Tutorial/README.md b/docs/Drivers/PHP/Tutorial/README.md index ac8a1aa7..b0aae139 100644 --- a/docs/Drivers/PHP/Tutorial/README.md +++ b/docs/Drivers/PHP/Tutorial/README.md @@ -287,7 +287,7 @@ Whenever the document id is yet unknown, but you want to fetch a document from t ``` This will return all documents from the specified collection (here: "users") with the properties provided in the example (here: that have an attribute "name" with a value of "John"). The result is a cursor which can be iterated sequentially or completely. We have chosen to get the complete result set above by calling the cursor's getAll() method. -Note that CollectionHandler->byExample() might return multiple documents if the example is ambigious. +Note that CollectionHandler->byExample() might return multiple documents if the example is ambiguous. ## Updating a document From 620954452fbdcfaa5702c5dd3a0385149054143c Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 27 Mar 2019 17:31:26 +0100 Subject: [PATCH 007/101] fix a test --- tests/AdminTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/AdminTest.php b/tests/AdminTest.php index 7ffd33fc..d2e8a4cc 100644 --- a/tests/AdminTest.php +++ b/tests/AdminTest.php @@ -50,7 +50,7 @@ public function testGetServerVersionWithDetails() $details = $result['details']; static::assertArrayHasKey('build-date', $details); static::assertArrayHasKey('icu-version', $details); - static::assertArrayHasKey('openssl-version', $details); + static::assertArrayHasKey('openssl-version-compile-time', $details); static::assertArrayHasKey('server-version', $details); static::assertArrayHasKey('v8-version', $details); } From 24c47abc49d23416b1b80af56b7d380d83153e77 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 28 Jun 2019 16:51:51 +0200 Subject: [PATCH 008/101] make it work with current devel version --- tests/GraphExtendedTest.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/GraphExtendedTest.php b/tests/GraphExtendedTest.php index 75987d58..dec6b82e 100644 --- a/tests/GraphExtendedTest.php +++ b/tests/GraphExtendedTest.php @@ -575,7 +575,7 @@ public function testGetReplaceUpdateAndRemoveOnNonExistentObjects() // Try to replace edge using GraphHandler - // This should cause an exception with a code of 404 + // This should cause an exception with a code of 400 try { $e = null; $this->graphHandler->replaceEdge($this->graphName, $this->edge1Name, 'label', $edge1); @@ -583,7 +583,7 @@ public function testGetReplaceUpdateAndRemoveOnNonExistentObjects() // don't bother us... just give us the $e } static::assertInstanceOf(ServerException::class, $e); - static::assertEquals(404, $e->getCode(), 'Should be 404, instead got: ' . $e->getCode()); + static::assertEquals(400, $e->getCode(), 'Should be 400, instead got: ' . $e->getCode()); // Try to remove the edge using GraphHandler @@ -801,18 +801,18 @@ public function testSaveVerticesAndSaveReplaceUpdateAndRemoveEdge() static::assertEquals('vertex2', $result2->getKey(), 'Did not return vertex2!'); - $result1 = $this->graphHandler->saveEdge( + $result3 = $this->graphHandler->saveEdge( $this->graphName, $result1->getInternalId(), $result2->getInternalId(), $this->edgeLabel1, $edge1 ); - static::assertEquals($this->edgeCollectionName . '/edge1', $result1, 'Did not return edge1!'); + static::assertEquals($this->edgeCollectionName . '/edge1', $result3, 'Did not return edge1!'); - $result1 = $this->graphHandler->getEdge($this->graphName, $this->edge1Name); - static::assertEquals('edge1', $result1->getKey(), 'Did not return edge1!'); + $result3 = $this->graphHandler->getEdge($this->graphName, $this->edge1Name); + static::assertEquals('edge1', $result3->getKey(), 'Did not return edge1!'); $edge1a->setFrom($result1->getInternalId()); $edge1a->setTo($result2->getInternalId()); @@ -898,18 +898,18 @@ public function testSaveVerticesAndConditionalSaveReplaceUpdateAndRemoveEdge() static::assertEquals('vertex2', $result2->getKey(), 'Did not return vertex2!'); - $result1 = $this->graphHandler->saveEdge( + $result3 = $this->graphHandler->saveEdge( $this->graphName, $result1->getInternalId(), $result2->getInternalId(), $this->edgeLabel1, $edge1 ); - static::assertEquals('ArangoDB_PHP_TestSuite_TestEdgeCollection_01' . '_' . static::$testsTimestamp . '/edge1', $result1, 'Did not return edge1!'); + static::assertEquals('ArangoDB_PHP_TestSuite_TestEdgeCollection_01' . '_' . static::$testsTimestamp . '/edge1', $result3, 'Did not return edge1!'); - $result1 = $this->graphHandler->getEdge($this->graphName, $this->edge1Name); - static::assertEquals('edge1', $result1->getKey(), 'Did not return edge1!'); + $result3 = $this->graphHandler->getEdge($this->graphName, $this->edge1Name); + static::assertEquals('edge1', $result3->getKey(), 'Did not return edge1!'); $edge1a->setFrom($result1->getInternalId()); $edge1a->setTo($result2->getInternalId()); @@ -920,7 +920,7 @@ public function testSaveVerticesAndConditionalSaveReplaceUpdateAndRemoveEdge() $this->edge1Name, $this->edgeLabel1, $edge1a, - ['revision' => $result1->getRevision()] + ['revision' => $result3->getRevision()] ); static::assertTrue($result1a, 'Did not return true!'); From 40cfded2e5d87c4b4e59cbb52829c2f69d067fae Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 28 Jun 2019 17:05:35 +0200 Subject: [PATCH 009/101] added the ability to create TTL indexes via the driver --- lib/ArangoDBClient/CollectionHandler.php | 43 ++++++++++++--- tests/CollectionBasicTest.php | 69 ++++++++++++++---------- 2 files changed, 77 insertions(+), 35 deletions(-) diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index aa82681e..ae02c692 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -161,6 +161,16 @@ class CollectionHandler extends Handler * persistent index option */ const OPTION_PERSISTENT_INDEX = 'persistent'; + + /** + * ttl index option + */ + const OPTION_TTL_INDEX = 'ttl'; + + /** + * expireAfter option + */ + const OPTION_EXPIRE_AFTER = 'expireAfter'; /** * sparse index option @@ -848,7 +858,7 @@ public function import( * @param boolean $unique - whether the values in the index should be unique or not * @param boolean $sparse - whether the index should be sparse * - * @link https://docs.arangodb.com/HTTP/Indexes/Hash.html + * @link https://www.arangodb.com/docs/devel/indexing-hash.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception @@ -874,7 +884,7 @@ public function createHashIndex($collectionId, array $fields, $unique = null, $s * @param array $fields - an array of fields * @param int $minLength - the minimum length of words to index * - * @link https://docs.arangodb.com/HTTP/Indexes/Fulltext.html + * @link https://www.arangodb.com/docs/devel/indexing-fulltext.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception @@ -898,7 +908,7 @@ public function createFulltextIndex($collectionId, array $fields, $minLength = n * @param bool $unique - whether the index is unique or not * @param bool $sparse - whether the index should be sparse * - * @link https://docs.arangodb.com/HTTP/Indexes/Skiplist.html + * @link https://www.arangodb.com/docs/devel/indexing-skiplist.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception @@ -925,7 +935,7 @@ public function createSkipListIndex($collectionId, array $fields, $unique = null * @param bool $unique - whether the index is unique or not * @param bool $sparse - whether the index should be sparse * - * @link https://docs.arangodb.com/HTTP/Indexes/Persistent.html + * @link https://www.arangodb.com/docs/devel/indexing-persistent.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception @@ -943,6 +953,27 @@ public function createPersistentIndex($collectionId, array $fields, $unique = nu return $this->index($collectionId, self::OPTION_PERSISTENT_INDEX, $fields, null, $indexOptions); } + + /** + * Create a TTL index + * + * @param string $collectionId - the collection id + * @param array $fields - an array of fields (only a single one allowed) + * @param number $expireAfter - number of seconds after index value after which documents expire + * + * @link https://www.arangodb.com/docs/devel/indexing-ttl.html + * + * @return array - server response of the created index + * @throws \ArangoDBClient\Exception + */ + public function createTtlIndex($collectionId, array $fields, $expireAfter) + { + $indexOptions = [ + self::OPTION_EXPIRE_AFTER => (double) $expireAfter + ]; + + return $this->index($collectionId, self::OPTION_TTL_INDEX, $fields, null, $indexOptions); + } /** * Create a geo index @@ -951,7 +982,7 @@ public function createPersistentIndex($collectionId, array $fields, $unique = nu * @param array $fields - an array of fields * @param boolean $geoJson - whether to use geoJson or not * - * @link https://docs.arangodb.com/HTTP/Indexes/Geo.html + * @link https://www.arangodb.com/docs/devel/indexing-geo.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception @@ -977,7 +1008,7 @@ public function createGeoIndex($collectionId, array $fields, $geoJson = null) * @throws Exception * * @param mixed $collectionId - The id of the collection where the index is to be created - * @param string $type - index type: hash, skiplist, geo, fulltext, or persistent + * @param string $type - index type: hash, skiplist, geo, ttl, fulltext, or persistent * @param array $attributes - an array of attributes that can be defined like array('a') or array('a', 'b.c') * @param bool $unique - true/false to create a unique index * @param array $indexOptions - an associative array of options for the index like array('geoJson' => true, 'sparse' => false) diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 02c8abfc..6b7df06f 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -14,8 +14,6 @@ * @property Connection connection * @property Collection collection * @property CollectionHandler collectionHandler - * @property bool hasSparseIndexes - * @property bool hasSelectivityEstimates */ class CollectionBasicTest extends \PHPUnit_Framework_TestCase @@ -43,9 +41,6 @@ public function setUp() $adminHandler = new AdminHandler($this->connection); $version = preg_replace('/-[a-z0-9]+$/', '', $adminHandler->getServerVersion()); - $this->hasSparseIndexes = (version_compare($version, '2.5.0') >= 0); - $this->hasSelectivityEstimates = (version_compare($version, '2.5.0') >= 0); - $this->isMMFilesEngine = ($adminHandler->getEngine()["name"] == "mmfiles"); } @@ -730,12 +725,8 @@ public function testCreateHashIndex() static::assertEquals('hashfield2', $indexInfo['fields'][1], "The second indexed field is not 'hashfield2'"); static::assertTrue($indexInfo[CollectionHandler::OPTION_UNIQUE], 'unique was not set to true!'); - if ($this->hasSparseIndexes) { - static::assertFalse($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to false!'); - } - if ($this->hasSelectivityEstimates) { - static::assertTrue(isset($indexInfo['selectivityEstimate']), 'selectivity estimate not present!'); - } + static::assertFalse($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to false!'); + static::assertTrue(isset($indexInfo['selectivityEstimate']), 'selectivity estimate not present!'); } @@ -769,12 +760,8 @@ public function testCreateSparseHashIndex() static::assertEquals('hashfield2', $indexInfo['fields'][1], "The second indexed field is not 'hashfield2'"); static::assertFalse($indexInfo[CollectionHandler::OPTION_UNIQUE], 'unique was not set to false!'); - if ($this->hasSparseIndexes) { - static::assertTrue($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to true!'); - } - if ($this->hasSelectivityEstimates) { - static::assertTrue(isset($indexInfo['selectivityEstimate']), 'selectivity estimate not present!'); - } + static::assertTrue($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to true!'); + static::assertTrue(isset($indexInfo['selectivityEstimate']), 'selectivity estimate not present!'); } @@ -836,9 +823,7 @@ public function testCreateSkipListIndex() static::assertEquals('skiplistfield1', $indexInfo['fields'][0], "The indexed field is not 'skiplistfield1'"); static::assertEquals('skiplistfield2', $indexInfo['fields'][1], "The indexed field is not 'skiplistfield2'"); static::assertTrue($indexInfo[CollectionHandler::OPTION_UNIQUE], 'unique was not set to true!'); - if ($this->hasSparseIndexes) { - static::assertFalse($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to false!'); - } + static::assertFalse($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to false!'); } @@ -871,9 +856,7 @@ public function testCreateSparseSkipListIndex() static::assertEquals('skiplistfield1', $indexInfo['fields'][0], "The indexed field is not 'skiplistfield1'"); static::assertEquals('skiplistfield2', $indexInfo['fields'][1], "The indexed field is not 'skiplistfield2'"); static::assertFalse($indexInfo[CollectionHandler::OPTION_UNIQUE], 'unique was not set to false!'); - if ($this->hasSparseIndexes) { - static::assertTrue($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to true!'); - } + static::assertTrue($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to true!'); } @@ -905,9 +888,7 @@ public function testCreatePersistentIndex() static::assertEquals('field1', $indexInfo['fields'][0], "The indexed field is not 'field1'"); static::assertEquals('field2', $indexInfo['fields'][1], "The indexed field is not 'field2'"); static::assertTrue($indexInfo[CollectionHandler::OPTION_UNIQUE], 'unique was not set to true!'); - if ($this->hasSparseIndexes) { - static::assertFalse($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to false!'); - } + static::assertFalse($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to false!'); } @@ -940,9 +921,39 @@ public function testCreateSparsePersistentIndex() static::assertEquals('field1', $indexInfo['fields'][0], "The indexed field is not 'field1'"); static::assertEquals('field2', $indexInfo['fields'][1], "The indexed field is not 'field2'"); static::assertFalse($indexInfo[CollectionHandler::OPTION_UNIQUE], 'unique was not set to false!'); - if ($this->hasSparseIndexes) { - static::assertTrue($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to true!'); - } + static::assertTrue($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to true!'); + } + + + /** + * Create a TTL index and verify it by getting information about the index from the server + */ + public function testCreateTtlIndex() + { + $result = $this->collectionHandler->createTtlIndex( + 'ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, + ['expireStamp'], + 60 + ); + + $indices = $this->collectionHandler->getIndexes('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp); + + $indicesByIdentifiers = $indices['identifiers']; + + static::assertArrayHasKey($result['id'], $indicesByIdentifiers, 'TTL index was not created!'); + + $indexInfo = $indicesByIdentifiers[$result['id']]; + + static::assertEquals( + CollectionHandler::OPTION_TTL_INDEX, + $indexInfo[CollectionHandler::OPTION_TYPE], + "Index type is not 'ttl'!" + ); + static::assertCount(1, $indexInfo['fields'], 'There should only be 1 indexed field'); + static::assertEquals('expireStamp', $indexInfo['fields'][0], "The indexed field is not 'expireStamp'"); + static::assertEquals(60, $indexInfo[CollectionHandler::OPTION_EXPIRE_AFTER]); + static::assertFalse($indexInfo[CollectionHandler::OPTION_UNIQUE], 'unique was not set to false!'); + static::assertTrue($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to false!'); } From cc17088ffd91efee83a585f66750399af3efdda1 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 28 Jun 2019 17:08:36 +0200 Subject: [PATCH 010/101] use RC4 --- tests/travis/setup_arangodb.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index ebd460c4..ddab1448 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -35,8 +35,8 @@ echo "./phpunit --version" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $DIR -docker pull arangodb/arangodb-preview:devel -docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:devel +docker pull arangodb/arangodb-preview:3.5.0-rc.4 +docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:3.5.0-rc.4 sleep 2 From b153bcf133c76210b2df1cceaf57ad00d50cbdb7 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 1 Jul 2019 12:58:40 +0200 Subject: [PATCH 011/101] added support for background indexes, ttl indexes and some more collection attributes --- CHANGELOG.md | 15 +++ lib/ArangoDBClient/Collection.php | 129 ++++++++++++++---- lib/ArangoDBClient/CollectionHandler.php | 77 ++++++++--- tests/CollectionBasicTest.php | 159 +++++++++++++++++++++++ tests/bootstrap.php | 15 +++ 5 files changed, 349 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e75ddc2..e7d73294 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +Release notes for the ArangoDB-PHP driver 3.5.x +=============================================== + +The `CollectionHandler` class got a new method `createTtlIndex` for creating time-to-live (TTL) +indexes on the server. + +All methods for index creation also got an extra optional attribute `$inBackground` that enables +background index creation. + +Added support for the following attributes on collection level: + +- distributeShardsLike +- smartJoinAttribute (only effective in ArangoDB enterprise edition) + + Release notes for the ArangoDB-PHP driver 3.4.x =============================================== diff --git a/lib/ArangoDBClient/Collection.php b/lib/ArangoDBClient/Collection.php index fc6f4d82..75d7f5b2 100644 --- a/lib/ArangoDBClient/Collection.php +++ b/lib/ArangoDBClient/Collection.php @@ -68,6 +68,13 @@ class Collection * @var bool - isVolatile value */ private $_isVolatile; + + /** + * The distributeShardsLike value (might be NULL for new collections) + * + * @var mixed - distributeShardsLike value + */ + private $_distributeShardsLike; /** * The collection numberOfShards value (might be NULL for new collections) @@ -96,6 +103,13 @@ class Collection * @var array - shardKeys value */ private $_shardKeys; + + /** + * The smartJoinAttribute value (might be NULL for new collections) + * + * @var mixed - smartJoinAttribute value + */ + private $_smartJoinAttribute; /** * The collection status value @@ -155,6 +169,11 @@ class Collection * Collection 'isVolatile' index */ const ENTRY_IS_VOLATILE = 'isVolatile'; + + /** + * Collection 'distributeShardsLike' index + */ + const ENTRY_DISTRIBUTE_SHARDS_LIKE = 'distributeShardsLike'; /** * Collection 'numberOfShards' index @@ -170,11 +189,16 @@ class Collection * Collection 'shardingStrategy' index */ const ENTRY_SHARDING_STRATEGY = 'shardingStrategy'; - + /** * Collection 'shardKeys' index */ const ENTRY_SHARD_KEYS = 'shardKeys'; + + /** + * Collection 'smartJoinAttribute' index + */ + const ENTRY_SMART_JOIN_ATTRIBUTE = 'smartJoinAttribute'; /** * properties option @@ -271,16 +295,18 @@ public static function getDefaultType() */ public function __clone() { - $this->_id = null; - $this->_name = null; - $this->_waitForSync = null; - $this->_journalSize = null; - $this->_isSystem = null; - $this->_isVolatile = null; - $this->_numberOfShards = null; - $this->_replicationFactor = null; - $this->_shardingStrategy = null; - $this->_shardKeys = null; + $this->_id = null; + $this->_name = null; + $this->_waitForSync = null; + $this->_journalSize = null; + $this->_isSystem = null; + $this->_isVolatile = null; + $this->_distributeShardsLike = null; + $this->_numberOfShards = null; + $this->_replicationFactor = null; + $this->_shardingStrategy = null; + $this->_shardKeys = null; + $this->_smartJoinAttribute = null; } /** @@ -335,6 +361,10 @@ public function getAll() self::ENTRY_STATUS => $this->_status, self::ENTRY_KEY_OPTIONS => $this->_keyOptions ]; + + if (null !== $this->_distributeShardsLike) { + $result[self::ENTRY_DISTRIBUTE_SHARDS_LIKE] = $this->_distributeShardsLike; + } if (null !== $this->_numberOfShards) { $result[self::ENTRY_NUMBER_OF_SHARDS] = $this->_numberOfShards; @@ -347,10 +377,14 @@ public function getAll() if (null !== $this->_shardingStrategy) { $result[self::ENTRY_SHARDING_STRATEGY] = $this->_shardingStrategy; } - + if (is_array($this->_shardKeys)) { $result[self::ENTRY_SHARD_KEYS] = $this->_shardKeys; } + + if (null !== $this->_smartJoinAttribute) { + $result[self::ENTRY_SMART_JOIN_ATTRIBUTE] = $this->_smartJoinAttribute; + } return $result; } @@ -378,79 +412,76 @@ public function set($key, $value) if ($key === self::ENTRY_ID) { $this->setId($value); - return; } if ($key === self::ENTRY_NAME) { $this->setName($value); - return; } if ($key === self::ENTRY_WAIT_SYNC) { $this->setWaitForSync($value); - return; } if ($key === self::ENTRY_JOURNAL_SIZE) { $this->setJournalSize($value); - return; } if ($key === self::ENTRY_IS_SYSTEM) { $this->setIsSystem($value); - return; } if ($key === self::ENTRY_IS_VOLATILE) { $this->setIsVolatile($value); - return; } if ($key === self::ENTRY_TYPE) { $this->setType($value); - return; } if ($key === self::ENTRY_STATUS) { $this->setStatus($value); - return; } if ($key === self::ENTRY_KEY_OPTIONS) { $this->setKeyOptions($value); - + return; + } + + if ($key === self::ENTRY_DISTRIBUTE_SHARDS_LIKE) { + $this->setDistributeShardsLike($value); return; } if ($key === self::ENTRY_NUMBER_OF_SHARDS) { $this->setNumberOfShards($value); - return; } if ($key === self::ENTRY_REPLICATION_FACTOR) { $this->setReplicationFactor($value); - return; } if ($key === self::ENTRY_SHARDING_STRATEGY) { $this->setShardingStrategy($value); - return; } - + if ($key === self::ENTRY_SHARD_KEYS) { $this->setShardKeys($value); - + return; + } + + if ($key === self::ENTRY_SMART_JOIN_ATTRIBUTE) { + $this->setSmartJoinAttribute($value); return; } // unknown attribute, will be ignored @@ -726,6 +757,28 @@ public function getIsVolatile() { return $this->_isVolatile; } + + /** + * Set the distribute shards like value + * + * @param string $value - distributeShardsLike value + * + * @return void + */ + public function setDistributeShardsLike($value) + { + $this->_distributeShardsLike = $value; + } + + /** + * Get the distributeShardsLike (if already known) + * + * @return mixed - distributeShardsLike value + */ + public function getDistributeShardsLike() + { + return $this->_distributeShardsLike; + } /** * Set the numberOfShards value @@ -795,7 +848,7 @@ public function getShardingStrategy() { return $this->_shardingStrategy; } - + /** * Set the shardKeys value * @@ -818,6 +871,28 @@ public function getShardKeys() { return $this->_shardKeys; } + + /** + * Set the smart join attribute value + * + * @param string $value - smartJoinAttribute value + * + * @return void + */ + public function setSmartJoinAttribute($value) + { + $this->_smartJoinAttribute = $value; + } + + /** + * Get the smart join attribute value (if already known) + * + * @return mixed - smart join attribute value + */ + public function getSmartJoinAttribute() + { + return $this->_smartJoinAttribute; + } } class_alias(Collection::class, '\triagens\ArangoDb\Collection'); diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index ae02c692..adab99ca 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -171,6 +171,11 @@ class CollectionHandler extends Handler * expireAfter option */ const OPTION_EXPIRE_AFTER = 'expireAfter'; + + /** + * inBackground option + */ + const OPTION_IN_BACKGROUND = 'inBackground'; /** * sparse index option @@ -224,16 +229,18 @@ class CollectionHandler extends Handler * @param mixed $collection - collection object to be created on the server or a string with the name * @param array $options - an array of options. *

    Options are :
    - *

  • 'type' - 2 -> normal collection, 3 -> edge-collection
  • - *
  • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
  • - *
  • 'journalSize' - journalSize value.
  • - *
  • 'isSystem' - false->user collection(default), true->system collection .
  • - *
  • 'isVolatile' - false->persistent collection(default), true->volatile (in-memory) collection .
  • - *
  • 'keyOptions' - key options to use.
  • - *
  • 'numberOfShards' - number of shards for the collection.
  • - *
  • 'shardKeys' - array of shard key attributes.
  • - *
  • 'replicationFactor' - number of replicas to keep (default: 1).
  • - *
  • 'shardingStrategy' - sharding strategy to use in cluster.
  • + *
  • 'type' - 2 -> normal collection, 3 -> edge-collection
  • + *
  • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
  • + *
  • 'journalSize' - journalSize value.
  • + *
  • 'isSystem' - false->user collection(default), true->system collection .
  • + *
  • 'isVolatile' - false->persistent collection(default), true->volatile (in-memory) collection .
  • + *
  • 'keyOptions' - key options to use.
  • + *
  • 'distributeShardsLike' - name of prototype collection for identical sharding.
  • + *
  • 'numberOfShards' - number of shards for the collection.
  • + *
  • 'replicationFactor' - number of replicas to keep (default: 1).
  • + *
  • 'shardKeys' - array of shard key attributes.
  • + *
  • 'shardingStrategy' - sharding strategy to use in cluster.
  • + *
  • 'smartJoinAttribute' - attribute name for smart joins (if not shard key).
  • *

    * * @return mixed - id of collection created @@ -276,6 +283,10 @@ public function create($collection, array $options = []) ]; // set extra cluster attributes + if ($collection->getDistributeShardsLike() !== null) { + $params[Collection::ENTRY_DISTRIBUTE_SHARDS_LIKE] = $collection->getDistributeShardsLike(); + } + if ($collection->getNumberOfShards() !== null) { $params[Collection::ENTRY_NUMBER_OF_SHARDS] = $collection->getNumberOfShards(); } @@ -291,6 +302,10 @@ public function create($collection, array $options = []) if (is_array($collection->getShardKeys())) { $params[Collection::ENTRY_SHARD_KEYS] = $collection->getShardKeys(); } + + if ($collection->getSmartJoinAttribute() !== null) { + $params[Collection::ENTRY_SMART_JOIN_ATTRIBUTE] = $collection->getSmartJoinAttribute(); + } $response = $this->getConnection()->post(Urls::URL_COLLECTION, $this->json_encode_wrapper($params)); @@ -855,15 +870,16 @@ public function import( * * @param string $collectionId - the collection id * @param array $fields - an array of fields - * @param boolean $unique - whether the values in the index should be unique or not - * @param boolean $sparse - whether the index should be sparse + * @param bool $unique - whether the values in the index should be unique or not + * @param bool $sparse - whether the index should be sparse + * @param bool $inBackground - true if index shall be created in background * * @link https://www.arangodb.com/docs/devel/indexing-hash.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createHashIndex($collectionId, array $fields, $unique = null, $sparse = null) + public function createHashIndex($collectionId, array $fields, $unique = null, $sparse = null, $inBackground = false) { $indexOptions = []; @@ -873,6 +889,9 @@ public function createHashIndex($collectionId, array $fields, $unique = null, $s if ($sparse) { $indexOptions[self::OPTION_SPARSE] = (bool) $sparse; } + if ($inBackground) { + $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; + } return $this->index($collectionId, self::OPTION_HASH_INDEX, $fields, null, $indexOptions); } @@ -883,19 +902,23 @@ public function createHashIndex($collectionId, array $fields, $unique = null, $s * @param string $collectionId - the collection id * @param array $fields - an array of fields * @param int $minLength - the minimum length of words to index + * @param bool $inBackground - true if index shall be created in background * * @link https://www.arangodb.com/docs/devel/indexing-fulltext.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createFulltextIndex($collectionId, array $fields, $minLength = null) + public function createFulltextIndex($collectionId, array $fields, $minLength = null, $inBackground = false) { $indexOptions = []; if ($minLength) { $indexOptions[self::OPTION_MIN_LENGTH] = $minLength; } + if ($inBackground) { + $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; + } return $this->index($collectionId, self::OPTION_FULLTEXT_INDEX, $fields, null, $indexOptions); } @@ -907,13 +930,14 @@ public function createFulltextIndex($collectionId, array $fields, $minLength = n * @param array $fields - an array of fields * @param bool $unique - whether the index is unique or not * @param bool $sparse - whether the index should be sparse + * @param bool $inBackground - true if index shall be created in background * * @link https://www.arangodb.com/docs/devel/indexing-skiplist.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createSkipListIndex($collectionId, array $fields, $unique = null, $sparse = null) + public function createSkipListIndex($collectionId, array $fields, $unique = null, $sparse = null, $inBackground = false) { $indexOptions = []; @@ -923,6 +947,9 @@ public function createSkipListIndex($collectionId, array $fields, $unique = null if ($sparse) { $indexOptions[self::OPTION_SPARSE] = (bool) $sparse; } + if ($inBackground) { + $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; + } return $this->index($collectionId, self::OPTION_SKIPLIST_INDEX, $fields, null, $indexOptions); } @@ -934,13 +961,14 @@ public function createSkipListIndex($collectionId, array $fields, $unique = null * @param array $fields - an array of fields * @param bool $unique - whether the index is unique or not * @param bool $sparse - whether the index should be sparse + * @param bool $inBackground - true if index shall be created in background * * @link https://www.arangodb.com/docs/devel/indexing-persistent.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createPersistentIndex($collectionId, array $fields, $unique = null, $sparse = null) + public function createPersistentIndex($collectionId, array $fields, $unique = null, $sparse = null, $inBackground = false) { $indexOptions = []; @@ -950,6 +978,9 @@ public function createPersistentIndex($collectionId, array $fields, $unique = nu if ($sparse) { $indexOptions[self::OPTION_SPARSE] = (bool) $sparse; } + if ($inBackground) { + $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; + } return $this->index($collectionId, self::OPTION_PERSISTENT_INDEX, $fields, null, $indexOptions); } @@ -960,17 +991,21 @@ public function createPersistentIndex($collectionId, array $fields, $unique = nu * @param string $collectionId - the collection id * @param array $fields - an array of fields (only a single one allowed) * @param number $expireAfter - number of seconds after index value after which documents expire + * @param bool $inBackground - true if index shall be created in background * * @link https://www.arangodb.com/docs/devel/indexing-ttl.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createTtlIndex($collectionId, array $fields, $expireAfter) + public function createTtlIndex($collectionId, array $fields, $expireAfter, $inBackground = false) { $indexOptions = [ self::OPTION_EXPIRE_AFTER => (double) $expireAfter ]; + if ($inBackground) { + $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; + } return $this->index($collectionId, self::OPTION_TTL_INDEX, $fields, null, $indexOptions); } @@ -980,20 +1015,24 @@ public function createTtlIndex($collectionId, array $fields, $expireAfter) * * @param string $collectionId - the collection id * @param array $fields - an array of fields - * @param boolean $geoJson - whether to use geoJson or not + * @param bool $geoJson - whether to use geoJson or not + * @param bool $inBackground - true if index shall be created in background * * @link https://www.arangodb.com/docs/devel/indexing-geo.html * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createGeoIndex($collectionId, array $fields, $geoJson = null) + public function createGeoIndex($collectionId, array $fields, $geoJson = null, $inBackground = false) { $indexOptions = []; if ($geoJson) { $indexOptions[self::OPTION_GEOJSON] = (bool) $geoJson; } + if ($inBackground) { + $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; + } return $this->index($collectionId, self::OPTION_GEO_INDEX, $fields, null, $indexOptions); } diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 6b7df06f..6ffd8453 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -217,6 +217,42 @@ public function testCreateCollectionWithKeyOptionsCluster() static::assertEquals(501, $e->getCode()); } + + + /** + * Try to create a collection with distributeShardsLike + */ + public function testCreateCollectionWithDistributeShardsLike() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + $connection = $this->connection; + $collectionHandler = new CollectionHandler($connection); + + $collection1 = new Collection(); + $name1 = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; + $collection1->setName($name1); + $response = $collectionHandler->create($collection1); + + $resultingCollection = $collectionHandler->getProperties($response); + $properties = $resultingCollection->getAll(); + static::assertFalse(array_key_exists(Collection::ENTRY_DISTRIBUTE_SHARDS_LIKE, $properties)); + + $collection2 = new Collection(); + $name2 = 'ArangoDB_PHP_TestSuite_TestCollection_02' . '_' . static::$testsTimestamp; + $collection2->setName($name2); + $collection2->setDistributeShardsLike($name1); + $response = $collectionHandler->create($collection2); + + $resultingCollection = $collectionHandler->getProperties($response); + $properties = $resultingCollection->getAll(); + + static::assertEquals($name1, $properties[Collection::ENTRY_DISTRIBUTE_SHARDS_LIKE]); + } /** @@ -323,6 +359,46 @@ public function testCreateCollectionWithReplicationFactor2() static::assertEquals(2, $properties[Collection::ENTRY_REPLICATION_FACTOR]); } + /** + * Try to create a collection with replication factor "satellite" + */ + public function testCreateCollectionWithReplicationFactorSatellite() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + if (!isEnterprise($this->connection)) { + // don't execute this test in community version + $this->markTestSkipped("test is only meaningful in enterprise version"); + return; + } + + $connection = $this->connection; + $collection = new Collection(); + $collectionHandler = new CollectionHandler($connection); + + $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; + + try { + $collectionHandler->drop($name); + } catch (Exception $e) { + //Silence the exception + } + + $collection->setName($name); + $collection->setReplicationFactor("satellite"); + + $response = $collectionHandler->create($collection); + + $resultingCollection = $collectionHandler->getProperties($response); + $properties = $resultingCollection->getAll(); + + static::assertEquals("satellite", $properties[Collection::ENTRY_REPLICATION_FACTOR]); + } + /** * Try to create a collection with an explicit sharding strategy @@ -470,6 +546,48 @@ public function testCreateCollectionWithShardKeysCluster() 'Shard keys do not match.' ); } + + /** + * Try to create a collection with smart join attribute + */ + public function testCreateCollectionWithSmartJoinAttribute() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + if (!isEnterprise($this->connection)) { + // don't execute this test in community version + $this->markTestSkipped("test is only meaningful in enterprise version"); + return; + } + + $connection = $this->connection; + $collection = new Collection(); + $collectionHandler = new CollectionHandler($connection); + + $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; + + try { + $collectionHandler->drop($name); + } catch (Exception $e) { + //Silence the exception + } + + $collection->setName($name); + $collection->setShardKeys(['_key:']); + $collection->setSmartJoinAttribute("myAttribute"); + + $response = $collectionHandler->create($collection); + + $resultingCollection = $collectionHandler->getProperties($response); + $properties = $resultingCollection->getAll(); + + static::assertEquals([ '_key:' ], $properties[Collection::ENTRY_SHARD_KEYS]); + static::assertEquals("myAttribute", $properties[Collection::ENTRY_SMART_JOIN_ATTRIBUTE]); + } /** @@ -982,6 +1100,37 @@ public function testGetIndex() static::assertEquals('testGetIndexField', $indexInfo['fields'][0], 'Index field does not match!'); static::assertEquals(100, $indexInfo[CollectionHandler::OPTION_MIN_LENGTH], 'Min length does not match!'); } + + + /** + * Create an index in background and verify it by getting information about the index from the server + */ + public function testCreateIndexInBackground() + { + $result = $this->collectionHandler->createHashIndex( + 'ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, + ['test'], + false, + false, + true + ); + + $indices = $this->collectionHandler->getIndexes('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp); + + $indicesByIdentifiers = $indices['identifiers']; + + static::assertArrayHasKey($result['id'], $indicesByIdentifiers); + + $indexInfo = $indicesByIdentifiers[$result['id']]; + + static::assertEquals( + CollectionHandler::OPTION_HASH_INDEX, + $indexInfo[CollectionHandler::OPTION_TYPE] + ); + static::assertEquals(['test'], $indexInfo['fields']); + static::assertFalse($indexInfo[CollectionHandler::OPTION_UNIQUE], 'unique was not set to false!'); + static::assertFalse($indexInfo[CollectionHandler::OPTION_SPARSE], 'sparse flag was not set to false!'); + } public function testHasCollectionReturnsFalseIfCollectionDoesNotExist() { @@ -1000,6 +1149,16 @@ public function tearDown() } catch (Exception $e) { //Silence the exception } + try { + $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); + } catch (Exception $e) { + //Silence the exception + } + try { + $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_02' . '_' . static::$testsTimestamp); + } catch (Exception $e) { + //Silence the exception + } unset($this->collectionHandler, $this->connection); } } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 165fd0b0..63f84a99 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -9,6 +9,21 @@ namespace ArangoDBClient; +function isEnterprise(Connection $connection) +{ + static $isEnterprise = null; + + if ($isEnterprise === null) { + $adminHandler = new AdminHandler($connection); + $version = $adminHandler->getServerVersion(true); + if (@$version["details"]["enterprise-version"] === "enterprise") { + $isEnterprise = true; + } + } + + return $isEnterprise; +} + function isCluster(Connection $connection) { static $isCluster = null; From 267e90ff9d19ba01ec8802ac9cf91c8fd2352d54 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 2 Aug 2019 15:33:27 +0200 Subject: [PATCH 012/101] store redundant regex part in a constant --- lib/ArangoDBClient/Document.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/ArangoDBClient/Document.php b/lib/ArangoDBClient/Document.php index 0e7384fd..f2fc58c1 100644 --- a/lib/ArangoDBClient/Document.php +++ b/lib/ArangoDBClient/Document.php @@ -129,6 +129,11 @@ class Document implements \JsonSerializable * keepNull option index */ const OPTION_KEEPNULL = 'keepNull'; + + /** + * regular expression used for key validation + */ + const KEY_REGEX_PART = '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}'; /** * Constructs an empty document @@ -299,25 +304,21 @@ public function set($key, $value) if ($key[0] === '_') { if ($key === self::ENTRY_ID) { $this->setInternalId($value); - return; } if ($key === self::ENTRY_KEY) { $this->setInternalKey($value); - return; } if ($key === self::ENTRY_REV) { $this->setRevision($value); - return; } if ($key === self::ENTRY_ISNEW) { $this->setIsNew($value); - return; } } @@ -638,7 +639,7 @@ public function setInternalId($id) } - if (!preg_match('/^[a-zA-Z0-9_-]{1,64}\/[a-zA-Z0-9_:.@\-()+,=;$!*\'%]{1,254}$/', $id)) { + if (!preg_match('/^[a-zA-Z0-9_-]{1,64}\/' . self::KEY_REGEX_PART . '$/', $id)) { throw new ClientException('Invalid format for document id'); } @@ -662,7 +663,7 @@ public function setInternalKey($key) throw new ClientException('Should not update the key of an existing document'); } - if (!preg_match('/^[a-zA-Z0-9_:.@\-()+,=;$!*\'%]{1,254}$/', $key)) { + if (!preg_match('/^' . self::KEY_REGEX_PART . '$/', $key)) { throw new ClientException('Invalid format for document key'); } From a384df66b29aea9d976555c5d756cb3a2217266e Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 2 Aug 2019 15:47:24 +0200 Subject: [PATCH 013/101] remove unused attribute and method from AqlUserFunction --- CHANGELOG.md | 3 +++ lib/ArangoDBClient/AqlUserFunction.php | 22 +--------------------- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7d73294..fb0e8e2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ Added support for the following attributes on collection level: - distributeShardsLike - smartJoinAttribute (only effective in ArangoDB enterprise edition) +Removed unused `$_action` member in class `AqlUserFunction`, also +removed its `__toString()` method. + Release notes for the ArangoDB-PHP driver 3.4.x =============================================== diff --git a/lib/ArangoDBClient/AqlUserFunction.php b/lib/ArangoDBClient/AqlUserFunction.php index a994b744..7bc252ff 100644 --- a/lib/ArangoDBClient/AqlUserFunction.php +++ b/lib/ArangoDBClient/AqlUserFunction.php @@ -43,7 +43,6 @@ * * @property string $name - The name of the user function * @property string $code - The code of the user function - * @property string _action * * @package ArangoDBClient * @since 1.3 @@ -58,19 +57,12 @@ class AqlUserFunction private $_connection; /** - * The transaction's attributes. + * The function's attributes. * * @var array */ protected $attributes = []; - /** - * The transaction's action. - * - * @var string - */ - protected $_action = ''; - /** * Collections index */ @@ -367,18 +359,6 @@ public function __get($key) } - /** - * Returns the action string - * - * @magic - * - * @return string - the current action string - */ - public function __toString() - { - return $this->_action; - } - /** * Build the object's attributes from a given array * From 8ff842c6e49b56e3f0c24a4830e0abe8ee7345ac Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 2 Aug 2019 16:00:29 +0200 Subject: [PATCH 014/101] added support for minReplicationFactor --- CHANGELOG.md | 1 + lib/ArangoDBClient/Collection.php | 49 +++++++++++++++++++++++- lib/ArangoDBClient/CollectionHandler.php | 5 +++ tests/CollectionBasicTest.php | 5 +++ 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb0e8e2e..7c0ca608 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Added support for the following attributes on collection level: - distributeShardsLike - smartJoinAttribute (only effective in ArangoDB enterprise edition) +- minReplicationFactor Removed unused `$_action` member in class `AqlUserFunction`, also removed its `__toString()` method. diff --git a/lib/ArangoDBClient/Collection.php b/lib/ArangoDBClient/Collection.php index 75d7f5b2..9c34dcea 100644 --- a/lib/ArangoDBClient/Collection.php +++ b/lib/ArangoDBClient/Collection.php @@ -90,6 +90,13 @@ class Collection */ private $_replicationFactor; + /** + * The minimum replicationFactor value for writes to be successful + * + * @var mixed - minimum replicationFactor value + */ + private $_minReplicationFactor; + /** * The shardingStrategy value (might be NULL for new collections) * @@ -185,6 +192,11 @@ class Collection */ const ENTRY_REPLICATION_FACTOR = 'replicationFactor'; + /** + * Collection 'minReplicationFactor' index + */ + const ENTRY_MIN_REPLICATION_FACTOR = 'minReplicationFactor'; + /** * Collection 'shardingStrategy' index */ @@ -304,6 +316,7 @@ public function __clone() $this->_distributeShardsLike = null; $this->_numberOfShards = null; $this->_replicationFactor = null; + $this->_minReplicationFactor = null; $this->_shardingStrategy = null; $this->_shardKeys = null; $this->_smartJoinAttribute = null; @@ -374,6 +387,10 @@ public function getAll() $result[self::ENTRY_REPLICATION_FACTOR] = $this->_replicationFactor; } + if (null !== $this->_minReplicationFactor) { + $result[self::ENTRY_MIN_REPLICATION_FACTOR] = $this->_minReplicationFactor; + } + if (null !== $this->_shardingStrategy) { $result[self::ENTRY_SHARDING_STRATEGY] = $this->_shardingStrategy; } @@ -470,6 +487,11 @@ public function set($key, $value) return; } + if ($key === self::ENTRY_MIN_REPLICATION_FACTOR) { + $this->setMinReplicationFactor($value); + return; + } + if ($key === self::ENTRY_SHARDING_STRATEGY) { $this->setShardingStrategy($value); return; @@ -807,7 +829,7 @@ public function getNumberOfShards() /** * Set the replicationFactor value * - * @param int $value - replicationFactor value + * @param mixed $value - replicationFactor value (either a number, or "satellite") * * @return void */ @@ -828,7 +850,30 @@ public function getReplicationFactor() } /** - * Set the shardingStragy value + * Set the minReplicationFactor value + * + * @param int $value - minReplicationFactor value + * + * @return void + */ + public function setMinReplicationFactor($value) + { + assert(null === $value || is_numeric($value)); + $this->_minReplicationFactor = $value; + } + + /** + * Get the minReplicationFactor value (if already known) + * + * @return mixed - minReplicationFactor value + */ + public function getMinReplicationFactor() + { + return $this->_minReplicationFactor; + } + + /** + * Set the shardingStrategy value * * @param string $value - shardingStrategy value * diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index adab99ca..d8948bf7 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -238,6 +238,7 @@ class CollectionHandler extends Handler *
  • 'distributeShardsLike' - name of prototype collection for identical sharding.
  • *
  • 'numberOfShards' - number of shards for the collection.
  • *
  • 'replicationFactor' - number of replicas to keep (default: 1).
  • + *
  • 'minReplicationFactor' - minimum number of replicas to be successful when writing (default: 1).
  • *
  • 'shardKeys' - array of shard key attributes.
  • *
  • 'shardingStrategy' - sharding strategy to use in cluster.
  • *
  • 'smartJoinAttribute' - attribute name for smart joins (if not shard key).
  • @@ -295,6 +296,10 @@ public function create($collection, array $options = []) $params[Collection::ENTRY_REPLICATION_FACTOR] = $collection->getReplicationFactor(); } + if ($collection->getMinReplicationFactor() !== null) { + $params[Collection::ENTRY_MIN_REPLICATION_FACTOR] = $collection->getMinReplicationFactor(); + } + if ($collection->getShardingStrategy() !== null) { $params[Collection::ENTRY_SHARDING_STRATEGY] = $collection->getShardingStrategy(); } diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 6ffd8453..6b408447 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -314,6 +314,7 @@ public function testCreateCollectionWithReplicationFactor1() } $collection->setName($name); + $collection->setMinReplicationFactor(1); $collection->setReplicationFactor(1); $response = $collectionHandler->create($collection); @@ -322,6 +323,7 @@ public function testCreateCollectionWithReplicationFactor1() $properties = $resultingCollection->getAll(); static::assertEquals(1, $properties[Collection::ENTRY_REPLICATION_FACTOR]); + static::assertEquals(1, $properties[Collection::ENTRY_MIN_REPLICATION_FACTOR]); } @@ -349,6 +351,7 @@ public function testCreateCollectionWithReplicationFactor2() } $collection->setName($name); + $collection->setMinReplicationFactor(2); $collection->setReplicationFactor(2); $response = $collectionHandler->create($collection); @@ -357,6 +360,7 @@ public function testCreateCollectionWithReplicationFactor2() $properties = $resultingCollection->getAll(); static::assertEquals(2, $properties[Collection::ENTRY_REPLICATION_FACTOR]); + static::assertEquals(2, $properties[Collection::ENTRY_MIN_REPLICATION_FACTOR]); } /** @@ -397,6 +401,7 @@ public function testCreateCollectionWithReplicationFactorSatellite() $properties = $resultingCollection->getAll(); static::assertEquals("satellite", $properties[Collection::ENTRY_REPLICATION_FACTOR]); + static::assertEquals(0, $properties[Collection::ENTRY_MIN_REPLICATION_FACTOR]); } From edc731acbfafe69626ba7846755514a85dfd1f8f Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 2 Aug 2019 17:58:35 +0200 Subject: [PATCH 015/101] refactor Transaction.php for streaming transactions --- CHANGELOG.md | 55 ++ examples/init.php | 2 +- examples/transaction-query.php | 61 ++ examples/transaction.php | 61 ++ lib/ArangoDBClient/CollectionHandler.php | 21 +- lib/ArangoDBClient/DocumentHandler.php | 45 +- lib/ArangoDBClient/Handler.php | 13 + lib/ArangoDBClient/Statement.php | 29 +- lib/ArangoDBClient/StreamingTransaction.php | 158 ++++ .../StreamingTransactionCollection.php | 102 +++ .../StreamingTransactionHandler.php | 171 +++++ lib/ArangoDBClient/Transaction.php | 245 +------ lib/ArangoDBClient/TransactionBase.php | 397 ++++++++++ lib/ArangoDBClient/ValueValidator.php | 4 + tests/StreamingTransactionTest.php | 682 ++++++++++++++++++ tests/TransactionTest.php | 32 +- 16 files changed, 1811 insertions(+), 267 deletions(-) create mode 100644 examples/transaction-query.php create mode 100644 examples/transaction.php create mode 100644 lib/ArangoDBClient/StreamingTransaction.php create mode 100644 lib/ArangoDBClient/StreamingTransactionCollection.php create mode 100644 lib/ArangoDBClient/StreamingTransactionHandler.php create mode 100644 lib/ArangoDBClient/TransactionBase.php create mode 100644 tests/StreamingTransactionTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c0ca608..2c7062fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,61 @@ Release notes for the ArangoDB-PHP driver 3.5.x =============================================== +Added support for streaming transactions (i.e. transactions that can be composed of multiple +operations on the client side piece-by-piece without specifying the full transaction operations +in advance). + +Streaming transactions currently support the following operations: + +- fetch documents by id, i.e. `DocumentHandler::getById()` +- update documents by id, i.e. `DocumentHandler::updateById()` +- replace documents by id, i.e. `DocumentHandler::replaceById()` +- remove documents by id, i.e. `DocumentHandler::removeById()` +- insert documents, i.e. `DocumentHandler::insert()` +- counting documents in a collection, i.e. `CollectionHandler::count()` +- truncating a collection, i.e. `CollectionHandler::truncate()` +- running AQL queries, i.e. `Statement::execute()` + +Streaming transactions are provided by a new class `StreamingTransaction` and a new handler +`StreamingTransactionHandler`. + + $document = new DocumentHandler($connection); + $transactionHandler = new StreamingTransactionHandler($connection); + + // creates a transaction object + $trx = new StreamingTransaction($connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => [ 'testCollection' ] + ] + ]); + + // starts the transaction + $trx = $transactionHandler->create($trx); + + // get a StreamingTransactionCollection object. this is used to execute operations + // in a transaction context + $trxCollection = $trx->getCollection('testCollection'); + + // pass the StreamingTransactionCollection into the document operations instead of + // a regular Collection object - this will make the operations execute in the context + // of the currently running transaction + $result = $documentHandler->insert($trxCollection, [ '_key' => 'test1', 'value' => 'test1' ]); + + $result = $documentHandler->insert($trxCollection, [ '_key' => 'test2', 'value' => 'test2' ]); + + // commits the transaction + $transactionHandler->commit($trx); + +Caveat: streaming transactions will normally stay open on the server side until they are explicitly +aborted or committed by the client application, or until they time out automatically on the server. +Therefore by default the PHP driver will automatically keep track of all begun streaming transactions, +via an instance variable in the `StreamingTransactionHandler`. + +Streaming transactions are automatically aborted on shutdown via a shutdown function, and all +transactions started via `StreamingTransactionHandler` instances that were neither committed nor +aborted by the user will be aborted. + + The `CollectionHandler` class got a new method `createTtlIndex` for creating time-to-live (TTL) indexes on the server. diff --git a/examples/init.php b/examples/init.php index 7276acc8..79860c59 100644 --- a/examples/init.php +++ b/examples/init.php @@ -51,7 +51,7 @@ ConnectionOptions::OPTION_AUTH_PASSWD => '', // password for basic authorization ConnectionOptions::OPTION_TIMEOUT => 30, // timeout in seconds - ConnectionOptions::OPTION_TRACE => $traceFunc, // tracer function, can be used for debugging + // ConnectionOptions::OPTION_TRACE => $traceFunc, // tracer function, can be used for debugging ConnectionOptions::OPTION_CREATE => false, // do not create unknown collections automatically ConnectionOptions::OPTION_UPDATE_POLICY => UpdatePolicy::LAST, // last update wins ]; diff --git a/examples/transaction-query.php b/examples/transaction-query.php new file mode 100644 index 00000000..7d03b21b --- /dev/null +++ b/examples/transaction-query.php @@ -0,0 +1,61 @@ +create($collection); + } catch (\Exception $e) { + // collection may already exist - ignore this error for now + } + + // clear everything, so we can start with a clean state + $collectionHandler->truncate($collection); + + // creates a transaction object + $trx = new StreamingTransaction($connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => 'users' + ] + ]); + + // starts the transaction + $trx = $transactionHandler->create($trx); + + // get a StreamingTransactionCollection object. this is used to execute operations + // in a transaction context + $trxCollection = $trx->getCollection('users'); + + // calling query() directly on the transaction makes the AQL query execute in the + // context of the running transaction + $result = $trx->query([ + 'query' => 'FOR i IN 1..10 INSERT { _key: CONCAT("test", i), value: i } INTO @@collection', + 'bindVars' => [ '@collection' => $trxCollection->getName() ] + ]); + + echo "BEFORE COMMIT" . PHP_EOL; + echo "COLLECTION COUNT OUTSIDE OF TRANSACTION IS: ", $collectionHandler->count($collection) . PHP_EOL; + echo "COLLECTION COUNT INSIDE OF TRANSACTION IS: ", $collectionHandler->count($trxCollection) . PHP_EOL; + + // commits the transaction + $transactionHandler->commit($trx); + + echo PHP_EOL; + echo "AFTER COMMIT" . PHP_EOL; + echo "COLLECTION COUNT IS: ", $collectionHandler->count($collection) . PHP_EOL; +} catch (ConnectException $e) { + print $e . PHP_EOL; +} catch (ServerException $e) { + print $e . PHP_EOL; +} catch (ClientException $e) { + print $e . PHP_EOL; +} diff --git a/examples/transaction.php b/examples/transaction.php new file mode 100644 index 00000000..01e8191c --- /dev/null +++ b/examples/transaction.php @@ -0,0 +1,61 @@ +create($collection); + } catch (\Exception $e) { + // collection may already exist - ignore this error for now + } + + // clear everything, so we can start with a clean state + $collectionHandler->truncate($collection); + + // creates a transaction object + $trx = new StreamingTransaction($connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => 'users' + ] + ]); + + // starts the transaction + $trx = $transactionHandler->create($trx); + + // get a StreamingTransactionCollection object. this is used to execute operations + // in a transaction context + $trxCollection = $trx->getCollection('users'); + + // pass the StreamingTransactionCollection into the document operations instead of + // a regular Collection object - this will make the operations execute in the context + // of the currently running transaction + $documentHandler->insert($trxCollection, [ '_key' => 'test1', 'value' => 'test1' ]); + + $documentHandler->insert($trxCollection, [ '_key' => 'test2', 'value' => 'test2' ]); + + echo "BEFORE COMMIT" . PHP_EOL; + echo "COLLECTION COUNT OUTSIDE OF TRANSACTION IS: ", $collectionHandler->count($collection) . PHP_EOL; + echo "COLLECTION COUNT INSIDE OF TRANSACTION IS: ", $collectionHandler->count($trxCollection) . PHP_EOL; + + // commits the transaction + $transactionHandler->commit($trx); + + echo PHP_EOL; + echo "AFTER COMMIT" . PHP_EOL; + echo "COLLECTION COUNT IS: ", $collectionHandler->count($collection) . PHP_EOL; +} catch (ConnectException $e) { + print $e . PHP_EOL; +} catch (ServerException $e) { + print $e . PHP_EOL; +} catch (ClientException $e) { + print $e . PHP_EOL; +} diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index d8948bf7..737d1ae4 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -393,9 +393,12 @@ public function has($collection) */ public function count($collection) { + $headers = []; + $this->addTransactionHeader($headers, $collection); + $collection = $this->makeCollection($collection); $url = UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collection, self::OPTION_COUNT]); - $response = $this->getConnection()->get($url); + $response = $this->getConnection()->get($url, $headers); $data = $response->getJson(); $count = $data[self::OPTION_COUNT]; @@ -616,15 +619,19 @@ public function unload($collection) */ public function truncate($collection) { - $collectionId = $this->getCollectionId($collection); - - if ($this->isValidCollectionId($collectionId)) { - throw new ClientException('Cannot alter a collection without a collection id'); + $headers = []; + $bodyParams = []; + $this->addTransactionHeader($headers, $collection); + if ($collection instanceof StreamingTransactionCollection) { + $bodyParams['transactionId'] = $collection->getTrxId(); } + $collection = $this->makeCollection($collection); + $this->getConnection()->put( - UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collectionId, self::OPTION_TRUNCATE]), - '' + UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collection, self::OPTION_TRUNCATE]), + $this->json_encode_wrapper($bodyParams), + $headers ); return true; diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index e2b05fd4..82ed19a7 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -170,19 +170,21 @@ public function getById($collection, $documentId, array $options = []) */ protected function getDocument($url, $collection, $documentId, array $options = []) { - $collection = $this->makeCollection($collection); + $headers = []; + $this->addTransactionHeader($headers, $collection); + + $collection = $this->makeCollection($collection); $url = UrlHelper::buildUrl($url, [$collection, $documentId]); - $headerElements = []; if (array_key_exists('ifMatch', $options) && array_key_exists('revision', $options)) { if ($options['ifMatch'] === true) { - $headerElements['If-Match'] = '"' . $options['revision'] . '"'; + $headers['If-Match'] = '"' . $options['revision'] . '"'; } else { - $headerElements['If-None-Match'] = '"' . $options['revision'] . '"'; + $headers['If-None-Match'] = '"' . $options['revision'] . '"'; } } - $response = $this->getConnection()->get($url, $headerElements); + $response = $this->getConnection()->get($url, $headers); if ($response->getHttpCode() === 304) { throw new ClientException('Document has not changed.'); @@ -232,19 +234,21 @@ public function getHead($collection, $documentId, $revision = null, $ifMatch = n */ protected function head($url, $collection, $documentId, $revision = null, $ifMatch = null) { - $collection = $this->makeCollection($collection); + $headers = []; + $this->addTransactionHeader($headers, $collection); + + $collection = $this->makeCollection($collection); $url = UrlHelper::buildUrl($url, [$collection, $documentId]); - $headerElements = []; if ($revision !== null && $ifMatch !== null) { if ($ifMatch) { - $headerElements['If-Match'] = '"' . $revision . '"'; + $headers['If-Match'] = '"' . $revision . '"'; } else { - $headerElements['If-None-Match'] = '"' . $revision . '"'; + $headers['If-None-Match'] = '"' . $revision . '"'; } } - - $response = $this->getConnection()->head($url, $headerElements); + + $response = $this->getConnection()->head($url, $headers); $headers = $response->getHeaders(); $headers['httpCode'] = $response->getHttpCode(); @@ -337,6 +341,9 @@ public function store(Document $document, $collection = null, array $options = [ */ public function save($collection, $document, array $options = []) { + $headers = []; + $this->addTransactionHeader($headers, $collection); + $collection = $this->makeCollection($collection); $_documentClass = $this->_documentClass; @@ -361,7 +368,7 @@ public function save($collection, $document, array $options = []) $data = $document->getAllForInsertUpdate(); } - $response = $this->getConnection()->post($url, $this->json_encode_wrapper($data)); + $response = $this->getConnection()->post($url, $this->json_encode_wrapper($data), $headers); $json = $response->getJson(); // This makes sure that if we're in batch mode, it will not go further and choke on the checks below. @@ -493,6 +500,9 @@ public function updateById($collection, $documentId, Document $document, array $ */ protected function patch($url, $collection, $documentId, Document $document, array $options = []) { + $headers = []; + $this->addTransactionHeader($headers, $collection); + $collection = $this->makeCollection($collection); $_documentClass = $this->_documentClass; @@ -509,7 +519,6 @@ protected function patch($url, $collection, $documentId, Document $document, arr ); - $headers = []; if (isset($params[ConnectionOptions::OPTION_UPDATE_POLICY]) && $params[ConnectionOptions::OPTION_UPDATE_POLICY] === UpdatePolicy::ERROR ) { @@ -618,6 +627,9 @@ public function replaceById($collection, $documentId, Document $document, array */ protected function put($url, $collection, $documentId, Document $document, array $options = []) { + $headers = []; + $this->addTransactionHeader($headers, $collection); + $collection = $this->makeCollection($collection); $_documentClass = $this->_documentClass; @@ -632,7 +644,6 @@ protected function put($url, $collection, $documentId, Document $document, array ] ); - $headers = []; if (isset($params[ConnectionOptions::OPTION_REPLACE_POLICY]) && $params[ConnectionOptions::OPTION_REPLACE_POLICY] === UpdatePolicy::ERROR ) { @@ -641,7 +652,7 @@ protected function put($url, $collection, $documentId, Document $document, array $headers['if-match'] = '"' . $options['revision'] . '"'; } } - + $data = $document->getAllForInsertUpdate(); $url = UrlHelper::buildUrl($url, [$collection, $documentId]); @@ -725,6 +736,9 @@ public function removeById($collection, $documentId, $revision = null, array $op */ protected function erase($url, $collection, $documentId, $revision = null, array $options = []) { + $headers = []; + $this->addTransactionHeader($headers, $collection); + $collection = $this->makeCollection($collection); $params = $this->includeOptionsInParams( @@ -737,7 +751,6 @@ protected function erase($url, $collection, $documentId, $revision = null, array ] ); - $headers = []; if (isset($params[ConnectionOptions::OPTION_DELETE_POLICY]) && $params[ConnectionOptions::OPTION_DELETE_POLICY] === UpdatePolicy::ERROR ) { diff --git a/lib/ArangoDBClient/Handler.php b/lib/ArangoDBClient/Handler.php index c1321e69..e772dc58 100644 --- a/lib/ArangoDBClient/Handler.php +++ b/lib/ArangoDBClient/Handler.php @@ -174,6 +174,19 @@ protected function makeCollection($value) return $value; } + + /** + * Add a transaction header to the array of headers in case this is a transactional operation + * + * @param array $headers - already existing headers + * @param mixed $collection - any type of collection (can be StreamingTransactionCollection or other) + */ + protected function addTransactionHeader(array &$headers, $collection) + { + if ($collection instanceof StreamingTransactionCollection) { + $headers['x-arango-trx-id'] = $collection->getTrxId(); + } + } } class_alias(Handler::class, '\triagens\ArangoDb\Handler'); diff --git a/lib/ArangoDBClient/Statement.php b/lib/ArangoDBClient/Statement.php index ab1cea0b..c071d205 100644 --- a/lib/ArangoDBClient/Statement.php +++ b/lib/ArangoDBClient/Statement.php @@ -149,6 +149,13 @@ class Statement * @var int */ private $_memoryLimit = 0; + + /** + * transaction id (used internally) + * + * @var string + */ + private $_trxId = null; /** * resultType @@ -157,7 +164,6 @@ class Statement */ private $resultType; - /** * Query string index */ @@ -208,6 +214,11 @@ class Statement */ const ENTRY_TTL = 'ttl'; + /** + * transaction attribute (used internally) + */ + const ENTRY_TRANSACTION = 'transaction'; + /** * Initialise the statement * @@ -284,6 +295,10 @@ public function __construct(Connection $connection, array $data) if (isset($data[self::ENTRY_MEMORY_LIMIT])) { $this->_memoryLimit = (int) $data[self::ENTRY_MEMORY_LIMIT]; } + + if (isset($data[self::ENTRY_TRANSACTION]) && $data[self::ENTRY_TRANSACTION] instanceof StreamingTransaction) { + $this->_trxId = $data[self::ENTRY_TRANSACTION]->getId(); + } } /** @@ -311,12 +326,18 @@ public function execute() throw new ClientException('Query should be a string'); } - $data = $this->buildData(); + $data = $this->buildData(); + + $headers = []; + if ($this->_trxId) { + // inject transaction id + $headers['x-arango-trx-id'] = $this->_trxId; + } - $tries = 0; + $tries = 0; while (true) { try { - $response = $this->_connection->post(Urls::URL_CURSOR, $this->getConnection()->json_encode_wrapper($data), []); + $response = $this->_connection->post(Urls::URL_CURSOR, $this->getConnection()->json_encode_wrapper($data), $headers); return new Cursor($this->_connection, $response->getJson(), $this->getCursorOptions()); } catch (ServerException $e) { diff --git a/lib/ArangoDBClient/StreamingTransaction.php b/lib/ArangoDBClient/StreamingTransaction.php new file mode 100644 index 00000000..1511c7bf --- /dev/null +++ b/lib/ArangoDBClient/StreamingTransaction.php @@ -0,0 +1,158 @@ +buildTransactionAttributesFromArray($transactionArray); + } + + // set up participating collections + $this->_collections = []; + foreach ($this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_EXCLUSIVE] as $name) { + $this->_collections[$name] = new StreamingTransactionCollection($this, $name, self::ENTRY_EXCLUSIVE); + } + + foreach ($this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_WRITE] as $name) { + if (!isset($this->_collections[$name])) { + $this->_collections[$name] = new StreamingTransactionCollection($this, $name, self::ENTRY_WRITE); + } + } + + foreach ($this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_READ] as $name) { + if (!isset($this->_collections[$name])) { + $this->_collections[$name] = new StreamingTransactionCollection($this, $name, self::ENTRY_READ); + } + } + } + + + /** + * Get a participating collection of the transaction by name + * Will throw an exception if the collection is not part of the transaction + * + * @throws ClientException + * + * @param string $name - name of the collection + * + * @return StreamingTransactionCollection - collection object + */ + public function getCollection($name) + { + if (!isset($this->_collections[$name])) { + throw new ClientException('Collection not registered in transaction'); + } + return $this->_collections[$name]; + } + + /** + * Get the transaction's id + * + * @return string - transaction id + */ + public function getId() + { + return $this->_id; + } + + /** + * Set the transaction's id - this is used internally and should not be called by end users + * + * @param mixed $id - transaction id as number or string + */ + public function setId($id) + { + assert(is_string($id) || is_numeric($id)); + + if ($this->_id !== null) { + throw new ClientException('Should not update the id of an existing transaction'); + } + + if (is_numeric($id)) { + $id = (string) $id; + } + $this->_id = $id; + } + + + /** + * Executes an AQL query inside the transaction + * + * This is a shortcut for creating a new Statement and executing it. + * + * @throws ClientException + * + * @param array $data - query data, as is required by Statement::__construct() + * + * @return Cursor - query cursor, as returned by Statement::execute() + */ + public function query(array $data) + { + $data['transaction'] = $this; + $statement = new Statement($this->getConnection(), $data); + return $statement->execute(); + } + + /** + * Build the object's attributes from a given array + * + * @param $options + * + * @throws \ArangoDBClient\ClientException + */ + protected function buildTransactionAttributesFromArray($options) + { + parent::buildTransactionAttributesFromArray($options); + + if (isset($options[self::ENTRY_ID])) { + $this->setId($options[self::ENTRY_ID]); + } + } + +} + +class_alias(Transaction::class, '\triagens\ArangoDb\StreamingTransaction'); diff --git a/lib/ArangoDBClient/StreamingTransactionCollection.php b/lib/ArangoDBClient/StreamingTransactionCollection.php new file mode 100644 index 00000000..b48c4cb7 --- /dev/null +++ b/lib/ArangoDBClient/StreamingTransactionCollection.php @@ -0,0 +1,102 @@ +_trx = $trx; + $this->_name = $name; + $this->_mode = $mode; + } + + /** + * Return the name of the collection + * + * @magic + * + * @return string - collection name + */ + public function __toString() + { + return $this->_name; + } + + /** + * Return the name of the collection + * + * @return string - collection name + */ + public function getName() + { + return $this->_name; + } + + /** + * Return the lock mode of the collection + * + * @return string - lock mode, i.e. 'read', 'write', 'exclusive' + */ + public function getMode() + { + return $this->_mode; + } + + /** + * Return the transaction's id + * + * @return string - transaction id + */ + public function getTrxId() + { + return $this->_trx->getId(); + } +} + +class_alias(Transaction::class, '\triagens\ArangoDb\StreamingTransactionCollection'); diff --git a/lib/ArangoDBClient/StreamingTransactionHandler.php b/lib/ArangoDBClient/StreamingTransactionHandler.php new file mode 100644 index 00000000..50d431e1 --- /dev/null +++ b/lib/ArangoDBClient/StreamingTransactionHandler.php @@ -0,0 +1,171 @@ +getConnection()); + } + + $response = $this->getConnection()->post( + Urls::URL_TRANSACTION . '/begin', + $this->getConnection()->json_encode_wrapper($trx->attributes) + ); + + $jsonResponse = $response->getJson(); + $id = $jsonResponse['result']['id']; + $trx->setId($id); + + $this->_pendingTransactions[$id] = true; + return $trx; + } + + /** + * Closes all pending transactions created by the handler + */ + public function closePendingTransactions() + { + // automatically abort all unintentionally kept-open transactions, so we don't + // leak server resources by not closing transactions + foreach ($this->_pendingTransactions as $id => $done) { + try { + $this->abort($id); + } catch (\Exception $e) { + // ignore all errors here + } + } + $this->_pendingTransactions = []; + } + + /** + * Retrieves the status of a transaction + * + * @throws ServerException + * + * @param mixed $trx - streaming transaction object or transaction id as string + * + * @return array - returns an array with attributes 'id' and 'status' + */ + public function getStatus($trx) + { + if ($trx instanceof StreamingTransaction) { + $id = $trx->getId(); + } else { + $id = (string) $trx; + } + + $response = $this->getConnection()->get(UrlHelper::buildUrl(Urls::URL_TRANSACTION, [$id])); + $jsonResponse = $response->getJson(); + + $status = $jsonResponse['result']['status']; + if ($status === 'aborted' || $status === 'committed') { + unset($this->_pendingTransactions[$id]); + } + + return $jsonResponse['result']; + } + + /** + * Commits a transaction + * + * @throws ServerException + * + * @param mixed $trx - streaming transaction object or transaction id as string + * + * @return bool - true if commit succeeds, throws an exception otherwise + */ + public function commit($trx) + { + if ($trx instanceof StreamingTransaction) { + $id = $trx->getId(); + } else { + $id = (string) $trx; + } + + unset($this->_pendingTransactions[$id]); + $this->getConnection()->put(UrlHelper::buildUrl(Urls::URL_TRANSACTION, [$id]), ''); + + return true; + } + + /** + * Aborts a transaction + * + * @throws ServerException + * + * @param mixed $trx - streaming transaction object or transaction id as string + * + * @return bool - true if abort succeeds, throws an exception otherwise + */ + public function abort($trx) + { + if ($trx instanceof StreamingTransaction) { + $id = $trx->getId(); + } else { + $id = (string) $trx; + } + + unset($this->_pendingTransactions[$id]); + $this->getConnection()->delete(UrlHelper::buildUrl(Urls::URL_TRANSACTION, [$id])); + + return true; + } + + /** + * Return all currently running transactions + * + * @throws ServerException + * + * @return array - array of currently running transactions, each transaction is an array with attributes 'id' and 'status' + */ + public function getRunning() + { + $response = $this->getConnection()->get(Urls::URL_TRANSACTION); + + $jsonResponse = $response->getJson(); + return $jsonResponse['transactions']; + } + +} + +class_alias(CollectionHandler::class, '\triagens\ArangoDb\StreamingTransactionHandler'); diff --git a/lib/ArangoDBClient/Transaction.php b/lib/ArangoDBClient/Transaction.php index 674fa850..ec18a26a 100644 --- a/lib/ArangoDBClient/Transaction.php +++ b/lib/ArangoDBClient/Transaction.php @@ -40,8 +40,9 @@ *
    * There are also helper functions to set collections directly, based on their locking: *
    - * $this->setWriteCollections($array or $string if single collection)
      * $this->setReadCollections($array or $string if single collection)
    + * $this->setWriteCollections($array or $string if single collection)
    + * $this->setExclusiveCollections($array or $string if single collection)
      * 
    *
    * @@ -55,57 +56,18 @@ * @package ArangoDBClient * @since 1.3 */ -class Transaction +class Transaction extends TransactionBase { - /** - * The connection object - * - * @var Connection - */ - private $_connection; - - /** - * The transaction's attributes. - * - * @var array - */ - protected $attributes = []; - - /** - * Collections index - */ - const ENTRY_COLLECTIONS = 'collections'; - /** * Action index */ const ENTRY_ACTION = 'action'; - /** - * WaitForSync index - */ - const ENTRY_WAIT_FOR_SYNC = 'waitForSync'; - - /** - * Lock timeout index - */ - const ENTRY_LOCK_TIMEOUT = 'lockTimeout'; - /** * Params index */ const ENTRY_PARAMS = 'params'; - /** - * Read index - */ - const ENTRY_READ = 'read'; - - /** - * WRITE index - */ - const ENTRY_WRITE = 'write'; - /** * @var $_action string The action property of the transaction. */ @@ -136,7 +98,8 @@ class Transaction */ public function __construct(Connection $connection, array $transactionArray = null) { - $this->_connection = $connection; + parent::__construct($connection); + if (is_array($transactionArray)) { $this->buildTransactionAttributesFromArray($transactionArray); } @@ -154,7 +117,7 @@ public function __construct(Connection $connection, array $transactionArray = nu */ public function execute() { - $response = $this->_connection->post( + $response = $this->getConnection()->post( Urls::URL_TRANSACTION, $this->getConnection()->json_encode_wrapper($this->attributes) ); @@ -167,49 +130,6 @@ public function execute() } - /** - * Return the connection object - * - * @return Connection - the connection object - */ - protected function getConnection() - { - return $this->_connection; - } - - - /** - * Set the collections array. - * - * The array should have 2 sub-arrays, namely 'read' and 'write' which should hold the respective collections - * for the transaction - * - * @param array $value - */ - public function setCollections(array $value) - { - if (array_key_exists('read', $value)) { - $this->setReadCollections($value['read']); - } - if (array_key_exists('write', $value)) { - $this->setWriteCollections($value['write']); - } - } - - - /** - * Get collections array - * - * This holds the read and write collections of the transaction - * - * @return array $value - */ - public function getCollections() - { - return $this->get(self::ENTRY_COLLECTIONS); - } - - /** * set action value * @@ -234,54 +154,6 @@ public function getAction() } - /** - * set waitForSync value - * - * @param bool $value - * - * @throws \ArangoDBClient\ClientException - */ - public function setWaitForSync($value) - { - $this->set(self::ENTRY_WAIT_FOR_SYNC, (bool) $value); - } - - - /** - * get waitForSync value - * - * @return bool waitForSync - */ - public function getWaitForSync() - { - return $this->get(self::ENTRY_WAIT_FOR_SYNC); - } - - - /** - * Set lockTimeout value - * - * @param int $value - * - * @throws \ArangoDBClient\ClientException - */ - public function setLockTimeout($value) - { - $this->set(self::ENTRY_LOCK_TIMEOUT, (int) $value); - } - - - /** - * Get lockTimeout value - * - * @return int lockTimeout - */ - public function getLockTimeout() - { - return $this->get(self::ENTRY_LOCK_TIMEOUT); - } - - /** * Set params value * @@ -306,56 +178,6 @@ public function getParams() } - /** - * Convenience function to directly set write-collections without having to access - * them from the collections attribute. - * - * @param array $value - */ - public function setWriteCollections($value) - { - - $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_WRITE] = $value; - } - - - /** - * Convenience function to directly get write-collections without having to access - * them from the collections attribute. - * - * @return array params - */ - public function getWriteCollections() - { - return $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_WRITE]; - } - - - /** - * Convenience function to directly set read-collections without having to access - * them from the collections attribute. - * - * @param array $value - */ - public function setReadCollections($value) - { - - $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_READ] = $value; - } - - - /** - * Convenience function to directly get read-collections without having to access - * them from the collections attribute. - * - * @return array params - */ - public function getReadCollections() - { - return $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_READ]; - } - - /** * Sets an attribute * @@ -392,57 +214,16 @@ public function set($key, $value) public function __set($key, $value) { switch ($key) { - case self::ENTRY_COLLECTIONS : - $this->setCollections($value); - break; - case 'writeCollections' : - $this->setWriteCollections($value); - break; - case 'readCollections' : - $this->setReadCollections($value); - break; case self::ENTRY_ACTION : $this->setAction($value); break; - case self::ENTRY_WAIT_FOR_SYNC : - $this->setWaitForSync($value); - break; - case self::ENTRY_LOCK_TIMEOUT : - $this->setLockTimeout($value); - break; case self::ENTRY_PARAMS : $this->setParams($value); break; default: - $this->set($key, $value); - break; - } - } - - - /** - * Get an attribute - * - * @param string $key - name of attribute - * - * @return mixed - value of attribute, NULL if attribute is not set - */ - public function get($key) - { - switch ($key) { - case 'writeCollections' : - return $this->getWriteCollections(); - break; - case 'readCollections' : - return $this->getReadCollections(); + parent::__set($key, $value); break; } - - if (isset($this->attributes[$key])) { - return $this->attributes[$key]; - } - - return null; } @@ -502,22 +283,12 @@ public function __toString() */ public function buildTransactionAttributesFromArray($options) { - if (isset($options[self::ENTRY_COLLECTIONS])) { - $this->setCollections($options[self::ENTRY_COLLECTIONS]); - } + parent::buildTransactionAttributesFromArray($options); if (isset($options[self::ENTRY_ACTION])) { $this->setAction($options[self::ENTRY_ACTION]); } - if (isset($options[self::ENTRY_WAIT_FOR_SYNC])) { - $this->setWaitForSync($options[self::ENTRY_WAIT_FOR_SYNC]); - } - - if (isset($options[self::ENTRY_LOCK_TIMEOUT])) { - $this->setLockTimeout($options[self::ENTRY_LOCK_TIMEOUT]); - } - if (isset($options[self::ENTRY_PARAMS])) { $this->setParams($options[self::ENTRY_PARAMS]); } diff --git a/lib/ArangoDBClient/TransactionBase.php b/lib/ArangoDBClient/TransactionBase.php new file mode 100644 index 00000000..f7e3006c --- /dev/null +++ b/lib/ArangoDBClient/TransactionBase.php @@ -0,0 +1,397 @@ +_connection = $connection; + + $this->attributes[self::ENTRY_COLLECTIONS] = [ + self::ENTRY_READ => [], + self::ENTRY_WRITE => [], + self::ENTRY_EXCLUSIVE => [] + ]; + } + + + /** + * Return the connection object + * + * @return Connection - the connection object + */ + protected function getConnection() + { + return $this->_connection; + } + + + /** + * Set the collections array. + * + * The array should have 2 sub-arrays, namely 'read' and 'write' which should hold the respective collections + * for the transaction + * + * @param array $value + */ + public function setCollections(array $value) + { + if (array_key_exists('read', $value)) { + $this->setReadCollections($value['read']); + } + if (array_key_exists('write', $value)) { + $this->setWriteCollections($value['write']); + } + if (array_key_exists('exclusive', $value)) { + $this->setExclusiveCollections($value['exclusive']); + } + } + + + /** + * Get collections array + * + * This holds the read and write collections of the transaction + * + * @return array $value + */ + public function getCollections() + { + return $this->get(self::ENTRY_COLLECTIONS); + } + + + /** + * set waitForSync value + * + * @param bool $value + * + * @throws \ArangoDBClient\ClientException + */ + public function setWaitForSync($value) + { + $this->set(self::ENTRY_WAIT_FOR_SYNC, (bool) $value); + } + + + /** + * get waitForSync value + * + * @return bool waitForSync + */ + public function getWaitForSync() + { + return $this->get(self::ENTRY_WAIT_FOR_SYNC); + } + + + /** + * Set lockTimeout value + * + * @param int $value + * + * @throws \ArangoDBClient\ClientException + */ + public function setLockTimeout($value) + { + $this->set(self::ENTRY_LOCK_TIMEOUT, (int) $value); + } + + + /** + * Get lockTimeout value + * + * @return int lockTimeout + */ + public function getLockTimeout() + { + return $this->get(self::ENTRY_LOCK_TIMEOUT); + } + + + /** + * Convenience function to directly set read-collections without having to access + * them from the collections attribute. + * + * @param array $value + */ + public function setReadCollections($value) + { + $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_READ] = (array) $value; + } + + + /** + * Convenience function to directly get read-collections without having to access + * them from the collections attribute. + * + * @return array params + */ + public function getReadCollections() + { + return $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_READ]; + } + + + /** + * Convenience function to directly set write-collections without having to access + * them from the collections attribute. + * + * @param array $value + */ + public function setWriteCollections($value) + { + $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_WRITE] = (array) $value; + } + + + /** + * Convenience function to directly get write-collections without having to access + * them from the collections attribute. + * + * @return array params + */ + public function getWriteCollections() + { + return $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_WRITE]; + } + + + /** + * Convenience function to directly set exclusive-collections without having to access + * them from the collections attribute. + * + * @param array $value + */ + public function setExclusiveCollections($value) + { + $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_EXCLUSIVE] = (array) $value; + } + + + /** + * Convenience function to directly get exclusive-collections without having to access + * them from the collections attribute. + * + * @return array params + */ + public function getExclusiveCollections() + { + return $this->attributes[self::ENTRY_COLLECTIONS][self::ENTRY_EXCLUSIVE]; + } + + + /** + * Sets an attribute + * + * @param $key + * @param $value + * + * @throws ClientException + */ + public function set($key, $value) + { + if (!is_string($key)) { + throw new ClientException('Invalid document attribute key'); + } + + $this->attributes[$key] = $value; + } + + + /** + * Set an attribute, magic method + * + * This is a magic method that allows the object to be used without + * declaring all document attributes first. + * + * @throws ClientException + * + * @magic + * + * @param string $key - attribute name + * @param mixed $value - value for attribute + * + * @return void + */ + public function __set($key, $value) + { + switch ($key) { + case self::ENTRY_COLLECTIONS : + $this->setCollections($value); + break; + case 'writeCollections' : + $this->setWriteCollections($value); + break; + case 'readCollections' : + $this->setReadCollections($value); + break; + case 'exclusiveCollections' : + $this->setExclusiveCollections($value); + break; + case self::ENTRY_WAIT_FOR_SYNC : + $this->setWaitForSync($value); + break; + case self::ENTRY_LOCK_TIMEOUT : + $this->setLockTimeout($value); + break; + default: + $this->set($key, $value); + break; + } + } + + + /** + * Get an attribute + * + * @param string $key - name of attribute + * + * @return mixed - value of attribute, NULL if attribute is not set + */ + public function get($key) + { + switch ($key) { + case 'readCollections' : + return $this->getReadCollections(); + break; + case 'writeCollections' : + return $this->getWriteCollections(); + break; + case 'exclusiveCollections' : + return $this->getExclusiveCollections(); + break; + } + + if (isset($this->attributes[$key])) { + return $this->attributes[$key]; + } + + return null; + } + + + /** + * Get an attribute, magic method + * + * This function is mapped to get() internally. + * + * @magic + * + * @param string $key - name of attribute + * + * @return mixed - value of attribute, NULL if attribute is not set + */ + public function __get($key) + { + return $this->get($key); + } + + + /** + * Is triggered by calling isset() or empty() on inaccessible properties. + * + * @param string $key - name of attribute + * + * @return boolean returns true or false (set or not set) + */ + public function __isset($key) + { + if (isset($this->attributes[$key])) { + return true; + } + + return false; + } + + + /** + * Build the object's attributes from a given array + * + * @param $options + * + * @throws \ArangoDBClient\ClientException + */ + protected function buildTransactionAttributesFromArray($options) + { + if (isset($options[self::ENTRY_COLLECTIONS])) { + $this->setCollections($options[self::ENTRY_COLLECTIONS]); + } + + if (isset($options[self::ENTRY_WAIT_FOR_SYNC])) { + $this->setWaitForSync($options[self::ENTRY_WAIT_FOR_SYNC]); + } + + if (isset($options[self::ENTRY_LOCK_TIMEOUT])) { + $this->setLockTimeout($options[self::ENTRY_LOCK_TIMEOUT]); + } + } +} + +class_alias(TransactionBase::class, '\triagens\ArangoDb\TransactionBase'); diff --git a/lib/ArangoDBClient/ValueValidator.php b/lib/ArangoDBClient/ValueValidator.php index c948960e..d4044351 100644 --- a/lib/ArangoDBClient/ValueValidator.php +++ b/lib/ArangoDBClient/ValueValidator.php @@ -45,6 +45,10 @@ public static function validate($value) return; } + if ($value instanceof Collection) { + return; + } + // type is invalid throw new ClientException('Invalid bind parameter value'); } diff --git a/tests/StreamingTransactionTest.php b/tests/StreamingTransactionTest.php new file mode 100644 index 00000000..d0a198bd --- /dev/null +++ b/tests/StreamingTransactionTest.php @@ -0,0 +1,682 @@ +_shutdown = []; + + $this->connection = getConnection(); + $this->collectionHandler = new CollectionHandler($this->connection); + + // clean up first + try { + $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); + } catch (\Exception $e) { + // don't bother us, if it's already deleted. + } + + try { + $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_02' . '_' . static::$testsTimestamp); + } catch (Exception $e) { + //Silence the exception + } + + + $this->collection1 = new Collection(); + $this->collection1->setName('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); + $this->collectionHandler->create($this->collection1); + + $this->collection2 = new Collection(); + $this->collection2->setName('ArangoDB_PHP_TestSuite_TestCollection_02' . '_' . static::$testsTimestamp); + $this->collectionHandler->create($this->collection2); + + $adminHandler = new AdminHandler($this->connection); + $this->isMMFilesEngine = ($adminHandler->getEngine()["name"] == "mmfiles"); + + $this->transactionHandler = new StreamingTransactionHandler($this->connection); + } + + + public function testCreateTransaction() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $status = $this->transactionHandler->getStatus($trx); + + static::assertEquals($trx->getId(), $status['id']); + static::assertEquals('running', $status['status']); + + $running = array_map(function($trx) { return $trx['id']; }, $this->transactionHandler->getRunning()); + static::assertTrue(in_array($trx->getId(), $running)); + } + + public function testCreateAndAbortTransaction() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + static::assertTrue($this->transactionHandler->abort($trx)); + $status = $this->transactionHandler->getStatus($trx); + + static::assertEquals($trx->getId(), $status['id']); + static::assertEquals('aborted', $status['status']); + + $running = array_map(function($trx) { return $trx['id']; }, $this->transactionHandler->getRunning()); + static::assertFalse(in_array($trx->getId(), $running)); + } + + public function testCreateAndAbortTransactionById() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + static::assertTrue($this->transactionHandler->abort($trx->getId())); + $status = $this->transactionHandler->getStatus($trx); + + static::assertEquals($trx->getId(), $status['id']); + static::assertEquals('aborted', $status['status']); + + $running = array_map(function($trx) { return $trx['id']; }, $this->transactionHandler->getRunning()); + static::assertFalse(in_array($trx->getId(), $running)); + } + + public function testCreateAndCommitTransaction() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + static::assertTrue($this->transactionHandler->commit($trx)); + $status = $this->transactionHandler->getStatus($trx); + + static::assertEquals($trx->getId(), $status['id']); + static::assertEquals('committed', $status['status']); + + $running = array_map(function($trx) { return $trx['id']; }, $this->transactionHandler->getRunning()); + static::assertFalse(in_array($trx->getId(), $running)); + } + + public function testCreateAndCommitTransactionById() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + static::assertTrue($this->transactionHandler->commit($trx->getId())); + $status = $this->transactionHandler->getStatus($trx); + + static::assertEquals($trx->getId(), $status['id']); + static::assertEquals('committed', $status['status']); + + $running = array_map(function($trx) { return $trx['id']; }, $this->transactionHandler->getRunning()); + static::assertFalse(in_array($trx->getId(), $running)); + } + + public function testCreateAndGetStatusTransaction() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $status = $this->transactionHandler->getStatus($trx); + + static::assertEquals($trx->getId(), $status['id']); + static::assertEquals('running', $status['status']); + + $running = array_map(function($trx) { return $trx['id']; }, $this->transactionHandler->getRunning()); + static::assertTrue(in_array($trx->getId(), $running)); + } + + public function testCreateAndGetStatusTransactionById() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $status = $this->transactionHandler->getStatus($trx->getId()); + + static::assertEquals($trx->getId(), $status['id']); + static::assertEquals('running', $status['status']); + + $running = array_map(function($trx) { return $trx['id']; }, $this->transactionHandler->getRunning()); + static::assertTrue(in_array($trx->getId(), $running)); + } + + public function testGetStatusForNonExistingTransaction() + { + $found = false; + try { + $this->transactionHandler->getStatus("999999999999"); + $found = true; + } catch (\Exception $e) { + static::assertEquals(404, $e->getCode()); + } + static::assertFalse($found); + } + + public function testCreateWithCollections() + { + $trx = new StreamingTransaction($this->connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_READ => [ $this->collection1->getName(), $this->collection2->getName() ] + ] + ]); + + $trx = $this->transactionHandler->create($trx); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $collection1 = $trx->getCollection($this->collection1->getName()); + static::assertEquals($this->collection1->getName(), $collection1->getName()); + static::assertEquals('read', $collection1->getMode()); + + $collection2 = $trx->getCollection($this->collection2->getName()); + static::assertEquals($this->collection2->getName(), $collection2->getName()); + static::assertEquals('read', $collection2->getMode()); + + $status = $this->transactionHandler->getStatus($trx->getId()); + + static::assertEquals($trx->getId(), $status['id']); + static::assertEquals('running', $status['status']); + + $running = array_map(function($trx) { return $trx['id']; }, $this->transactionHandler->getRunning()); + static::assertTrue(in_array($trx->getId(), $running)); + } + + public function testCreateWithCollectionsAndModes() + { + $trx = new StreamingTransaction($this->connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ], + TransactionBase::ENTRY_EXCLUSIVE => [ $this->collection2->getName() ] + ] + ]); + + $trx = $this->transactionHandler->create($trx); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $collection1 = $trx->getCollection($this->collection1->getName()); + static::assertEquals($this->collection1->getName(), $collection1->getName()); + static::assertEquals('write', $collection1->getMode()); + + $collection2 = $trx->getCollection($this->collection2->getName()); + static::assertEquals($this->collection2->getName(), $collection2->getName()); + static::assertEquals('exclusive', $collection2->getMode()); + + $status = $this->transactionHandler->getStatus($trx->getId()); + + static::assertEquals($trx->getId(), $status['id']); + static::assertEquals('running', $status['status']); + + $running = array_map(function($trx) { return $trx['id']; }, $this->transactionHandler->getRunning()); + static::assertTrue(in_array($trx->getId(), $running)); + } + + public function testGetCollection() + { + $trx = new StreamingTransaction($this->connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_READ => [ $this->collection1->getName(), $this->collection2->getName() ] + ] + ]); + + $trx = $this->transactionHandler->create($trx); + $this->_shutdown[] = $trx; + + $collection1 = $trx->getCollection($this->collection1->getName()); + static::assertEquals($this->collection1->getName(), $collection1->getName()); + static::assertEquals('read', $collection1->getMode()); + + $collection2 = $trx->getCollection($this->collection2->getName()); + static::assertEquals($this->collection2->getName(), $collection2->getName()); + static::assertEquals('read', $collection2->getMode()); + + $found = false; + try { + $trx->getCollection('piff'); + $found = true; + } catch (\Exception $e) { + } + static::assertFalse($found); + } + + public function testInsert() + { + $trx = new StreamingTransaction($this->connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] + ] + ]); + + $trx = $this->transactionHandler->create($trx); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $trxCollection = $trx->getCollection($this->collection1->getName()); + static::assertEquals($this->collection1->getName(), $trxCollection->getName()); + + $documentHandler = new DocumentHandler($this->connection); + $result = $documentHandler->save($trxCollection, [ '_key' => 'test', 'value' => 'test' ]); + static::assertEquals('test', $result); + + // non-transactional lookup should not find the document + $found = false; + try { + $documentHandler->getById($this->collection1->getName(), "test"); + $found = true; + } catch (\Exception $e) { + static::assertEquals(404, $e->getCode()); + } + static::assertFalse($found); + + // transactional lookup should find the document + $doc = $documentHandler->getById($trxCollection, "test"); + static::assertEquals('test', $doc->getKey()); + + // now commit + static::assertTrue($this->transactionHandler->commit($trx->getId())); + + // non-transactional lookup should find the document now too + $doc = $documentHandler->getById($this->collection1->getName(), "test"); + static::assertEquals('test', $doc->getKey()); + } + + public function testRemove() + { + // insert a document before the transaction + $documentHandler = new DocumentHandler($this->connection); + $result = $documentHandler->save($this->collection1->getName(), [ '_key' => 'test', 'value' => 'test' ]); + static::assertEquals('test', $result); + + $trx = new StreamingTransaction($this->connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] + ] + ]); + + $trx = $this->transactionHandler->create($trx); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $trxCollection = $trx->getCollection($this->collection1->getName()); + static::assertEquals($this->collection1->getName(), $trxCollection->getName()); + + // document should be present inside transaction + $doc = $documentHandler->getById($trxCollection, "test"); + static::assertEquals('test', $doc->getKey()); + + // remove document inside transaction + $result = $documentHandler->removeById($trxCollection, 'test'); + static::assertTrue($result); + + // transactional lookup should not find the document + $found = false; + try { + $documentHandler->getById($trxCollection, "test"); + $found = true; + } catch (\Exception $e) { + static::assertEquals(404, $e->getCode()); + } + static::assertFalse($found); + + // non-transactional lookup should still see it + $doc = $documentHandler->getById($this->collection1->getName(), "test"); + static::assertEquals('test', $doc->getKey()); + + // now commit + static::assertTrue($this->transactionHandler->commit($trx->getId())); + + // now it should be gone + $found = false; + try { + $documentHandler->getById($this->collection1->getName(), "test"); + $found = true; + } catch (\Exception $e) { + static::assertEquals(404, $e->getCode()); + } + static::assertFalse($found); + } + + public function testUpdate() + { + // insert a document before the transaction + $documentHandler = new DocumentHandler($this->connection); + $result = $documentHandler->save($this->collection1->getName(), [ '_key' => 'test', 'value' => 'test' ]); + static::assertEquals('test', $result); + + $trx = new StreamingTransaction($this->connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] + ] + ]); + + $trx = $this->transactionHandler->create($trx); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $trxCollection = $trx->getCollection($this->collection1->getName()); + static::assertEquals($this->collection1->getName(), $trxCollection->getName()); + + // document should be present inside transaction + $doc = $documentHandler->getById($trxCollection, "test"); + static::assertEquals('test', $doc->getKey()); + static::assertEquals('test', $doc->value); + + // update document inside transaction + $doc->value = 'foobar'; + $result = $documentHandler->updateById($trxCollection, 'test', $doc); + static::assertTrue($result); + + // transactional lookup should find the modified document + $doc = $documentHandler->getById($trxCollection, "test"); + static::assertEquals('test', $doc->getKey()); + static::assertEquals('foobar', $doc->value); + + // non-transactional lookup should still see the old document + $doc = $documentHandler->getById($this->collection1->getName(), "test"); + static::assertEquals('test', $doc->getKey()); + static::assertEquals('test', $doc->value); + + // now commit + static::assertTrue($this->transactionHandler->commit($trx->getId())); + + $doc = $documentHandler->getById($this->collection1->getName(), "test"); + static::assertEquals('test', $doc->getKey()); + static::assertEquals('foobar', $doc->value); + } + + public function testReplace() + { + // insert a document before the transaction + $documentHandler = new DocumentHandler($this->connection); + $result = $documentHandler->save($this->collection1->getName(), [ '_key' => 'test', 'value' => 'test' ]); + static::assertEquals('test', $result); + + $trx = new StreamingTransaction($this->connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] + ] + ]); + + $trx = $this->transactionHandler->create($trx); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $trxCollection = $trx->getCollection($this->collection1->getName()); + static::assertEquals($this->collection1->getName(), $trxCollection->getName()); + + // document should be present inside transaction + $doc = $documentHandler->getById($trxCollection, "test"); + static::assertEquals('test', $doc->getKey()); + static::assertEquals('test', $doc->value); + + // replace document inside transaction + unset($doc->value); + $doc->hihi = 'hoho'; + $result = $documentHandler->replaceById($trxCollection, 'test', $doc); + static::assertTrue($result); + + // transactional lookup should find the modified document + $doc = $documentHandler->getById($trxCollection, "test"); + static::assertEquals('test', $doc->getKey()); + static::assertEquals('hoho', $doc->hihi); + static::assertObjectNotHasAttribute('value', $doc); + + // non-transactional lookup should still see the old document + $doc = $documentHandler->getById($this->collection1->getName(), "test"); + static::assertEquals('test', $doc->getKey()); + static::assertEquals('test', $doc->value); + static::assertObjectNotHasAttribute('hihi', $doc); + + // now commit + static::assertTrue($this->transactionHandler->commit($trx->getId())); + + $doc = $documentHandler->getById($this->collection1->getName(), "test"); + static::assertEquals('test', $doc->getKey()); + static::assertEquals('hoho', $doc->hihi); + static::assertObjectNotHasAttribute('value', $doc); + } + + public function testTruncate() + { + $stmt = new Statement($this->connection, [ + 'query' => 'FOR i IN 1..10 INSERT { _key: CONCAT("test", i), value: i } INTO @@collection', + 'bindVars' => [ '@collection' => $this->collection1->getName() ] + ]); + $stmt->execute(); + + $trx = new StreamingTransaction($this->connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] + ] + ]); + + $trx = $this->transactionHandler->create($trx); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $trxCollection = $trx->getCollection($this->collection1->getName()); + static::assertEquals($this->collection1->getName(), $trxCollection->getName()); + + // truncate the collection inside the transaction + $this->collectionHandler->truncate($trxCollection); + + // transactional lookup should not find any documents + $collectionHandler = new CollectionHandler($this->connection); + static::assertEquals(0, $collectionHandler->count($trxCollection)); + $documentHandler = new DocumentHandler($this->connection); + $found = false; + for ($i = 1; $i <= 10; ++$i) { + try { + $documentHandler->getById($trxCollection, "test" . $i); + $found = true; + break; + } catch (\Exception $e) { + static::assertEquals(404, $e->getCode()); + } + } + static::assertFalse($found); + + // non-transactional lookup should find them all! + static::assertEquals(10, $this->collectionHandler->count($this->collection1->getName())); + for ($i = 1; $i <= 10; ++$i) { + $doc = $documentHandler->getById($this->collection1->getName(), "test" . $i); + self::assertEquals('test' . $i, $doc->getKey()); + } + } + + public function testQuery() + { + $trx = new StreamingTransaction($this->connection, [ + TransactionBase::ENTRY_COLLECTIONS => [ + TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] + ] + ]); + + $trx = $this->transactionHandler->create($trx); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue(is_string($trx->getId())); + + $trxCollection = $trx->getCollection($this->collection1->getName()); + static::assertEquals($this->collection1->getName(), $trxCollection->getName()); + + // execute query in transaction + $result = $trx->query([ + 'query' => 'FOR i IN 1..10 INSERT { _key: CONCAT("test", i), value: i } INTO @@collection', + 'bindVars' => [ '@collection' => $this->collection1->getName() ] + ]); + + // non-transactional lookup should not find any documents + $documentHandler = new DocumentHandler($this->connection); + $found = false; + for ($i = 1; $i <= 10; ++$i) { + try { + $documentHandler->getById($this->collection1->getName(), "test" . $i); + $found = true; + break; + } catch (\Exception $e) { + static::assertEquals(404, $e->getCode()); + } + } + static::assertFalse($found); + + // documents should not be visible outside of transaction + $collectionHandler = new CollectionHandler($this->connection); + static::assertEquals(0, $this->collectionHandler->count($this->collection1->getName())); + + // documents should be visible outside of transaction + static::assertEquals(10, $collectionHandler->count($trxCollection)); + } + + public function testCommitAndthenCommitTransaction() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue($this->transactionHandler->commit($trx)); + $status = $this->transactionHandler->getStatus($trx); + + static::assertTrue($this->transactionHandler->commit($trx)); + } + + public function testCommitAndthenAbortTransaction() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue($this->transactionHandler->commit($trx)); + $status = $this->transactionHandler->getStatus($trx); + + $success = false; + try { + $this->transactionHandler->abort($trx); + $success = true; + } catch (\Exception $e) { + } + + static::assertFalse($success); + } + + public function testAbortAndthenAbortTransaction() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue($this->transactionHandler->abort($trx)); + $status = $this->transactionHandler->getStatus($trx); + + static::assertTrue($this->transactionHandler->abort($trx)); + } + + public function testAbortAndthenCommitTransaction() + { + $trx = $this->transactionHandler->create(); + $this->_shutdown[] = $trx; + static::assertInstanceOf(StreamingTransaction::class, $trx); + + static::assertTrue($this->transactionHandler->abort($trx)); + $status = $this->transactionHandler->getStatus($trx); + + $success = false; + try { + $this->transactionHandler->commit($trx); + $success = true; + } catch (\Exception $e) { + } + + static::assertFalse($success); + } + + public function tearDown() + { + foreach ($this->_shutdown as $trx) { + try { + $this->transactionHandler->abort($trx); + } catch (\Exception $e) { + } + } + + try { + $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); + } catch (\Exception $e) { + // don't bother us, if it's already deleted. + } + try { + $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_02' . '_' . static::$testsTimestamp); + } catch (\Exception $e) { + // don't bother us, if it's already deleted. + } + } +} diff --git a/tests/TransactionTest.php b/tests/TransactionTest.php index db66c624..5418cfba 100644 --- a/tests/TransactionTest.php +++ b/tests/TransactionTest.php @@ -275,10 +275,10 @@ function () { // check if getters work fine static::assertEquals( - $writeCollections, $transaction->writeCollections, 'Did not return writeCollections, instead returned: ' . print_r($transaction->writeCollections, 1) + [$writeCollections], $transaction->writeCollections, 'Did not return writeCollections, instead returned: ' . print_r($transaction->writeCollections, 1) ); static::assertEquals( - $readCollections, $transaction->readCollections, 'Did not return readCollections, instead returned: ' . print_r($transaction->readCollections, 1) + [$readCollections], $transaction->readCollections, 'Did not return readCollections, instead returned: ' . print_r($transaction->readCollections, 1) ); static::assertEquals( $action, $transaction->action, 'Did not return action, instead returned: ' . $transaction->action @@ -342,6 +342,34 @@ function () { $result = $transaction->execute(); static::assertTrue($result, 'Did not return true, instead returned: ' . $result); } + + + /** + * Test if we can create and execute a transaction by using getters/setters + */ + public function testCreateAndExecuteTransactionExclusiveWithGettersSetters() + { + $exclusiveCollections = [$this->collection1->getName(), $this->collection2->getName()]; + $action = ' + function () { + var db = require("internal").db; + db.' . $this->collection1->getName() . '.save({ test : "hello" }); + }'; + + $transaction = new Transaction($this->connection); + + // check if setters work fine + $transaction->setExclusiveCollections($exclusiveCollections); + $transaction->setAction($action); + + // check if getters work fine + + static::assertEquals( + $exclusiveCollections, $transaction->getExclusiveCollections()); + + $result = $transaction->execute(); + static::assertTrue($result, 'Did not return true, instead returned: ' . $result); + } /** From 35777d26292724dcb645f528d7d18efb6744fecc Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 5 Aug 2019 12:51:03 +0200 Subject: [PATCH 016/101] adjust Docker container --- CHANGELOG.md | 3 +++ .../StreamingTransactionHandler.php | 21 +++++++++++++++---- tests/travis/setup_arangodb.sh | 4 ++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c7062fc..8e298c14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,9 @@ via an instance variable in the `StreamingTransactionHandler`. Streaming transactions are automatically aborted on shutdown via a shutdown function, and all transactions started via `StreamingTransactionHandler` instances that were neither committed nor aborted by the user will be aborted. +In order to take over the management of a transaction from the `StreamingTransactionHandler`, it is +possible to call the handler's `stealTransaction()` method with the transaction's id. This will +make the handler "forget" about auto-aborting this particular transaction. The `CollectionHandler` class got a new method `createTtlIndex` for creating time-to-live (TTL) diff --git a/lib/ArangoDBClient/StreamingTransactionHandler.php b/lib/ArangoDBClient/StreamingTransactionHandler.php index 50d431e1..c7d83a20 100644 --- a/lib/ArangoDBClient/StreamingTransactionHandler.php +++ b/lib/ArangoDBClient/StreamingTransactionHandler.php @@ -76,7 +76,20 @@ public function closePendingTransactions() } $this->_pendingTransactions = []; } - + + + /** + * Steal the transaction from the handler, so that it is not responsible anymore + * for auto-aborting it on shutdown + * + * @param string $id - transaction id + */ + public function stealTransaction($id) + { + unset($this->_pendingTransactions[$id]); + } + + /** * Retrieves the status of a transaction * @@ -99,7 +112,7 @@ public function getStatus($trx) $status = $jsonResponse['result']['status']; if ($status === 'aborted' || $status === 'committed') { - unset($this->_pendingTransactions[$id]); + $this->stealTransaction($id); } return $jsonResponse['result']; @@ -122,7 +135,7 @@ public function commit($trx) $id = (string) $trx; } - unset($this->_pendingTransactions[$id]); + $this->stealTransaction($id); $this->getConnection()->put(UrlHelper::buildUrl(Urls::URL_TRANSACTION, [$id]), ''); return true; @@ -145,7 +158,7 @@ public function abort($trx) $id = (string) $trx; } - unset($this->_pendingTransactions[$id]); + $this->stealTransaction($id); $this->getConnection()->delete(UrlHelper::buildUrl(Urls::URL_TRANSACTION, [$id])); return true; diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index ddab1448..8193ec06 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -35,8 +35,8 @@ echo "./phpunit --version" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $DIR -docker pull arangodb/arangodb-preview:3.5.0-rc.4 -docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:3.5.0-rc.4 +docker pull arangodb/arangodb-preview:3.5.0-rc.7 +docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:3.5.0-rc.7 sleep 2 From 47f7d68f465bb3018d96d3a77f7923c22884a420 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 5 Aug 2019 16:21:31 +0200 Subject: [PATCH 017/101] implemented several methods, added deprecation warnings --- CHANGELOG.md | 53 +++- lib/ArangoDBClient/CollectionHandler.php | 374 +++++++++++++++-------- tests/CollectionBasicTest.php | 198 ++++++++++++ 3 files changed, 488 insertions(+), 137 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e298c14..320392ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ Streaming transactions currently support the following operations: - truncating a collection, i.e. `CollectionHandler::truncate()` - running AQL queries, i.e. `Statement::execute()` +Other driver operations than the above are currently not supported within streaming transactions. + Streaming transactions are provided by a new class `StreamingTransaction` and a new handler `StreamingTransactionHandler`. @@ -59,13 +61,58 @@ possible to call the handler's `stealTransaction()` method with the transaction' make the handler "forget" about auto-aborting this particular transaction. +Deprecated several methods in `CollectionHandler`, because they are deprecated in the arangod +server as well: + +- CollectionHandler::fulltext() +- CollectionHandler::updateByExample() +- CollectionHandler::replaceByExample() +- CollectionHandler::range() +- CollectionHandler::near() +- CollectionHandler::within() + + +Added method `CollectionHandler::getShards()` to retrieve the list of available shards of a collection. + +Added method `CollectionHandler::getResponsibleShard()` to retrieve the shard id of the shard +responsible for storing a particular document. + + +All index-specific index-creation methods in `CollectionHandler` are now deprecated in favor of +the much more general method `CollectionHandler::createIndex()`. This new methods replaces the +following deprecated methods: + +- CollectionHandler::createHashIndex() +- CollectionHandler::createFulltextIndex() +- CollectionHandler::createSkipListIndex() +- CollectionHandler::createPersistentIndex() +- CollectionHandler::createTtlIndex() +- CollectionHandler::createGeoIndex() +- CollectionHandler::index() + +`CollectionHandler::createIndex()` now also supports named indexes and background indexing via +setting the respective options on index creation, e.g. + + $collectionHandler->createIndex($collection, [ + 'type' => 'persistent', + 'name' => 'my-index', + 'fields' => ['a', 'b'], + 'unique' => true, + 'sparse' => false, + 'inBackground' => true + ]); + +The now deprecated specialized index methods will be removed in a future release of the driver +in favor of the generic `createIndex` method. + + The `CollectionHandler` class got a new method `createTtlIndex` for creating time-to-live (TTL) indexes on the server. -All methods for index creation also got an extra optional attribute `$inBackground` that enables -background index creation. +All specialized methods for index creation also got an extra optional attribute `$inBackground` that +enables background index creation. -Added support for the following attributes on collection level: +Added driver support for the following attributes on collection level: - distributeShardsLike - smartJoinAttribute (only effective in ArangoDB enterprise edition) diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index 737d1ae4..6f653fe9 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -57,6 +57,11 @@ class CollectionHandler extends Handler */ const OPTION_KEYS = 'keys'; + /** + * stream parameter + */ + const OPTION_STREAM = 'stream'; + /** * left parameter */ @@ -201,6 +206,16 @@ class CollectionHandler extends Handler * revision option */ const OPTION_REVISION = 'revision'; + + /** + * responsible shard option + */ + const OPTION_RESPONSIBLE_SHARD = 'responsibleShard'; + + /** + * shards option + */ + const OPTION_SHARDS = 'shards'; /** * properties option @@ -485,7 +500,7 @@ public function figures($collection) * * @throws Exception * - * @param mixed $collectionId - collection id as a string or number + * @param mixed $collection - collection as string or object * @param boolean $withRevisions - optional boolean whether or not to include document revision ids * in the checksum calculation. * @param boolean $withData - optional boolean whether or not to include document body data in the @@ -493,10 +508,9 @@ public function figures($collection) * * @return array - array containing keys "checksum" and "revision" */ - public function getChecksum($collectionId, $withRevisions = false, $withData = false) + public function getChecksum($collection, $withRevisions = false, $withData = false) { - - $url = UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collectionId, self::OPTION_CHECKSUM]); + $url = UrlHelper::buildUrl(Urls::URL_COLLECTION, [$this->makeCollection($collection), self::OPTION_CHECKSUM]); $url = UrlHelper::appendParamsUrl($url, ['withRevisions' => $withRevisions, 'withData' => $withData]); $response = $this->getConnection()->get($url); @@ -511,14 +525,13 @@ public function getChecksum($collectionId, $withRevisions = false, $withData = f * * @throws Exception * - * @param mixed $collectionId - collection id as a string or number + * @param mixed $collection - collection as string or object * * @return array - containing a key revision */ - public function getRevision($collectionId) + public function getRevision($collection) { - - $url = UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collectionId, self::OPTION_REVISION]); + $url = UrlHelper::buildUrl(Urls::URL_COLLECTION, [$this->makeCollection($collection), self::OPTION_REVISION]); $response = $this->getConnection()->get($url); return $response->getJson(); @@ -529,22 +542,16 @@ public function getRevision($collectionId) * * @throws Exception * - * @param mixed $collection - collection id as string or number or collection object + * @param mixed $collection - collection as string or object * @param string $name - new name for collection * * @return bool - always true, will throw if there is an error */ public function rename($collection, $name) { - $collectionId = $this->getCollectionId($collection); - - if ($this->isValidCollectionId($collectionId)) { - throw new ClientException('Cannot alter a collection without a collection id'); - } - $params = [Collection::ENTRY_NAME => $name]; $this->getConnection()->put( - UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collectionId, self::OPTION_RENAME]), + UrlHelper::buildUrl(Urls::URL_COLLECTION, [$this->makeCollection($collection), self::OPTION_RENAME]), $this->json_encode_wrapper($params) ); @@ -558,20 +565,14 @@ public function rename($collection, $name) * * @throws Exception * - * @param mixed $collection - collection id as string or number or collection object + * @param mixed $collection - collection as string or object * * @return HttpResponse - HTTP response object */ public function load($collection) { - $collectionId = $this->getCollectionId($collection); - - if ($this->isValidCollectionId($collectionId)) { - throw new ClientException('Cannot alter a collection without a collection id'); - } - $result = $this->getConnection()->put( - UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collectionId, self::OPTION_LOAD]), + UrlHelper::buildUrl(Urls::URL_COLLECTION, [$this->makeCollection($collection), self::OPTION_LOAD]), '' ); @@ -585,20 +586,14 @@ public function load($collection) * * @throws Exception * - * @param mixed $collection - collection id as string or number or collection object + * @param mixed $collection - collection as string or object * * @return HttpResponse - HTTP response object */ public function unload($collection) { - $collectionId = $this->getCollectionId($collection); - - if ($this->isValidCollectionId($collectionId)) { - throw new ClientException('Cannot alter a collection without a collection id'); - } - $result = $this->getConnection()->put( - UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collectionId, self::OPTION_UNLOAD]), + UrlHelper::buildUrl(Urls::URL_COLLECTION, [$this->makeCollection($collection), self::OPTION_UNLOAD]), '' ); @@ -650,18 +645,12 @@ public function truncate($collection) */ public function drop($collection, array $options = []) { - $collectionName = $this->getCollectionName($collection); - - if ($this->isValidCollectionId($collectionName)) { - throw new ClientException('Cannot alter a collection without a collection id'); - } - $appendix = ''; if (is_array($options) && isset($options['isSystem'])) { $appendix = '?isSystem=' . UrlHelper::getBoolString($options['isSystem']); } - $this->getConnection()->delete(UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collectionName]) . $appendix); + $this->getConnection()->delete(UrlHelper::buildUrl(Urls::URL_COLLECTION, [$this->makeCollection($collection)]) . $appendix); return true; } @@ -766,7 +755,7 @@ public function getCollectionName($collection) * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collectionId - collection as string or object * @param mixed $importFileName - The filename that holds the import data. * @param array $options - optional - an array of options. *

    Options are :
    @@ -784,11 +773,7 @@ public function getCollectionName($collection) * * @return array - returns an array with the server's response data from the import command */ - public function importFromFile( - $collectionId, - $importFileName, - array $options = [] - ) + public function importFromFile($collection, $importFileName, array $options = []) { $contents = file_get_contents($importFileName); @@ -796,7 +781,7 @@ public function importFromFile( throw new ClientException('Input file "' . $importFileName . '" could not be found.'); } - return $this->import($collectionId, $contents, $options); + return $this->import($collection, $contents, $options); } @@ -806,7 +791,7 @@ public function importFromFile( * This will throw on all errors except insertion errors * * - * @param $collection mixed $collection - collection id as string or number + * @param $collection mixed $collection - collection as string or object * @param string|array $importData - The data to import. This can be a string holding the data according to the type of import, or an array of documents * @param array $options - optional - an array of options. *

    Options are :
    @@ -832,11 +817,7 @@ public function importFromFile( * @throws \ArangoDBClient\Exception * @throws \ArangoDBClient\ClientException */ - public function import( - $collection, - $importData, - array $options = [] - ) + public function import($collection, $importData, array $options = []) { $collection = $this->makeCollection($collection); @@ -880,20 +861,23 @@ public function import( /** * Create a hash index * - * @param string $collectionId - the collection id + * @param mixed $collection - the collection as name or object * @param array $fields - an array of fields * @param bool $unique - whether the values in the index should be unique or not * @param bool $sparse - whether the index should be sparse * @param bool $inBackground - true if index shall be created in background * - * @link https://www.arangodb.com/docs/devel/indexing-hash.html + * @deprecated use CollectionHandler::createIndex instead * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createHashIndex($collectionId, array $fields, $unique = null, $sparse = null, $inBackground = false) + public function createHashIndex($collection, array $fields, $unique = null, $sparse = null, $inBackground = false) { - $indexOptions = []; + $indexOptions = [ + self::OPTION_TYPE => 'hash', + self::OPTION_FIELDS => $fields + ]; if ($unique) { $indexOptions[self::OPTION_UNIQUE] = (bool) $unique; @@ -905,25 +889,28 @@ public function createHashIndex($collectionId, array $fields, $unique = null, $s $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; } - return $this->index($collectionId, self::OPTION_HASH_INDEX, $fields, null, $indexOptions); + return $this->createIndex($collection, $indexOptions); } /** * Create a fulltext index * - * @param string $collectionId - the collection id + * @param mixed $collection - collection as string or object * @param array $fields - an array of fields * @param int $minLength - the minimum length of words to index * @param bool $inBackground - true if index shall be created in background * - * @link https://www.arangodb.com/docs/devel/indexing-fulltext.html + * @deprecated use CollectionHandler::createIndex instead * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createFulltextIndex($collectionId, array $fields, $minLength = null, $inBackground = false) + public function createFulltextIndex($collection, array $fields, $minLength = null, $inBackground = false) { - $indexOptions = []; + $indexOptions = [ + self::OPTION_TYPE => 'fulltext', + self::OPTION_FIELDS => $fields + ]; if ($minLength) { $indexOptions[self::OPTION_MIN_LENGTH] = $minLength; @@ -932,26 +919,29 @@ public function createFulltextIndex($collectionId, array $fields, $minLength = n $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; } - return $this->index($collectionId, self::OPTION_FULLTEXT_INDEX, $fields, null, $indexOptions); + return $this->createIndex($collection, $indexOptions); } /** * Create a skip-list index * - * @param string $collectionId - the collection id + * @param mixed $collection - collection as string or object * @param array $fields - an array of fields * @param bool $unique - whether the index is unique or not * @param bool $sparse - whether the index should be sparse * @param bool $inBackground - true if index shall be created in background * - * @link https://www.arangodb.com/docs/devel/indexing-skiplist.html + * @deprecated use CollectionHandler::createIndex instead * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createSkipListIndex($collectionId, array $fields, $unique = null, $sparse = null, $inBackground = false) + public function createSkipListIndex($collection, array $fields, $unique = null, $sparse = null, $inBackground = false) { - $indexOptions = []; + $indexOptions = [ + self::OPTION_TYPE => 'skiplist', + self::OPTION_FIELDS => $fields + ]; if ($unique) { $indexOptions[self::OPTION_UNIQUE] = (bool) $unique; @@ -963,26 +953,29 @@ public function createSkipListIndex($collectionId, array $fields, $unique = null $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; } - return $this->index($collectionId, self::OPTION_SKIPLIST_INDEX, $fields, null, $indexOptions); + return $this->createIndex($collection, $indexOptions); } /** * Create a persistent index * - * @param string $collectionId - the collection id + * @param mixed $collection - collection as string or object * @param array $fields - an array of fields * @param bool $unique - whether the index is unique or not * @param bool $sparse - whether the index should be sparse - * @param bool $inBackground - true if index shall be created in background + * @param bool $inBackground - true if index shall be created in background * - * @link https://www.arangodb.com/docs/devel/indexing-persistent.html + * @deprecated use CollectionHandler::createIndex instead * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createPersistentIndex($collectionId, array $fields, $unique = null, $sparse = null, $inBackground = false) + public function createPersistentIndex($collection, array $fields, $unique = null, $sparse = null, $inBackground = false) { - $indexOptions = []; + $indexOptions = [ + self::OPTION_TYPE => 'persistent', + self::OPTION_FIELDS => $fields + ]; if ($unique) { $indexOptions[self::OPTION_UNIQUE] = (bool) $unique; @@ -994,50 +987,56 @@ public function createPersistentIndex($collectionId, array $fields, $unique = nu $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; } - return $this->index($collectionId, self::OPTION_PERSISTENT_INDEX, $fields, null, $indexOptions); + return $this->createIndex($collection, $indexOptions); } /** * Create a TTL index * - * @param string $collectionId - the collection id + * @param mixed $collection - collection as string or object * @param array $fields - an array of fields (only a single one allowed) * @param number $expireAfter - number of seconds after index value after which documents expire - * @param bool $inBackground - true if index shall be created in background + * @param bool $inBackground - true if index shall be created in background * - * @link https://www.arangodb.com/docs/devel/indexing-ttl.html + * @deprecated use CollectionHandler::createIndex instead * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createTtlIndex($collectionId, array $fields, $expireAfter, $inBackground = false) + public function createTtlIndex($collection, array $fields, $expireAfter, $inBackground = false) { $indexOptions = [ - self::OPTION_EXPIRE_AFTER => (double) $expireAfter + self::OPTION_TYPE => 'ttl', + self::OPTION_FIELDS => $fields, + self::OPTION_EXPIRE_AFTER => (double) $expireAfter ]; + if ($inBackground) { $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; } - return $this->index($collectionId, self::OPTION_TTL_INDEX, $fields, null, $indexOptions); + return $this->createIndex($collection, $indexOptions); } /** * Create a geo index * - * @param string $collectionId - the collection id + * @param mixed $collection - collection as string or object * @param array $fields - an array of fields * @param bool $geoJson - whether to use geoJson or not * @param bool $inBackground - true if index shall be created in background * - * @link https://www.arangodb.com/docs/devel/indexing-geo.html + * @deprecated use CollectionHandler::createIndex instead * * @return array - server response of the created index * @throws \ArangoDBClient\Exception */ - public function createGeoIndex($collectionId, array $fields, $geoJson = null, $inBackground = false) + public function createGeoIndex($collection, array $fields, $geoJson = null, $inBackground = false) { - $indexOptions = []; + $indexOptions = [ + self::OPTION_TYPE => 'geo', + self::OPTION_FIELDS => $fields, + ]; if ($geoJson) { $indexOptions[self::OPTION_GEOJSON] = (bool) $geoJson; @@ -1046,7 +1045,7 @@ public function createGeoIndex($collectionId, array $fields, $geoJson = null, $i $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; } - return $this->index($collectionId, self::OPTION_GEO_INDEX, $fields, null, $indexOptions); + return $this->createIndex($collection, $indexOptions); } /** @@ -1058,18 +1057,19 @@ public function createGeoIndex($collectionId, array $fields, $geoJson = null, $i * * @throws Exception * - * @param mixed $collectionId - The id of the collection where the index is to be created + * @param mixed $collection - collection as string or object * @param string $type - index type: hash, skiplist, geo, ttl, fulltext, or persistent * @param array $attributes - an array of attributes that can be defined like array('a') or array('a', 'b.c') * @param bool $unique - true/false to create a unique index * @param array $indexOptions - an associative array of options for the index like array('geoJson' => true, 'sparse' => false) * + * @deprecated use CollectionHandler::createIndex instead + * * @return array - server response of the created index */ - public function index($collectionId, $type, array $attributes = [], $unique = false, array $indexOptions = []) + public function index($collection, $type, array $attributes = [], $unique = false, array $indexOptions = []) { - - $urlParams = [self::OPTION_COLLECTION => $collectionId]; + $urlParams = [self::OPTION_COLLECTION => $this->makeCollection($collection)]; $bodyParams = [ self::OPTION_TYPE => $type, self::OPTION_FIELDS => $attributes, @@ -1087,8 +1087,43 @@ public function index($collectionId, $type, array $attributes = [], $unique = fa $httpCode = $response->getHttpCode(); switch ($httpCode) { case 404: - throw new ClientException('Collection-identifier is unknown'); + throw new ClientException('Collection is unknown'); + break; + case 400: + throw new ClientException('cannot create unique index due to documents violating uniqueness'); + break; + } + return $response->getJson(); + } + + + /** + * Creates an index on a collection on the server + * + * This will create an index on the collection on the server and return its id + * + * This will throw if the index cannot be created + * + * @throws Exception + * + * @param mixed $collection - collection as string or object + * @param array $indexOptions - an associative array of options for the index like array('type' => hash, 'fields' => ..., 'sparse' => false) + * + * @return array - server response of the created index + * @since 3.5 + */ + public function createIndex($collection, array $indexOptions) + { + $urlParams = [self::OPTION_COLLECTION => $this->makeCollection($collection)]; + + $url = UrlHelper::appendParamsUrl(Urls::URL_INDEX, $urlParams); + $response = $this->getConnection()->post($url, $this->json_encode_wrapper($indexOptions)); + + $httpCode = $response->getHttpCode(); + switch ($httpCode) { + case 404: + throw new ClientException('Collection is unknown'); break; case 400: throw new ClientException('cannot create unique index due to documents violating uniqueness'); @@ -1125,13 +1160,13 @@ public function getIndex($collection, $indexId) * * @throws Exception * - * @param mixed $collectionId - collection id as a string or number + * @param mixed $collection - collection as string or object * * @return array $data - the indexes result-set from the server */ - public function getIndexes($collectionId) + public function getIndexes($collection) { - $urlParams = [self::OPTION_COLLECTION => $collectionId]; + $urlParams = [self::OPTION_COLLECTION => $this->makeCollection($collection)]; $url = UrlHelper::appendParamsUrl(Urls::URL_INDEX, $urlParams); $response = $this->getConnection()->get($url); @@ -1143,37 +1178,95 @@ public function getIndexes($collectionId) * * @throws Exception * + * @param mixed $collection - collection as string or object * @param mixed $indexHandle - index handle (collection name / index id) * * @return bool - always true, will throw if there is an error */ - public function dropIndex($indexHandle) + public function dropIndex($collection, $indexHandle = null) { - $handle = explode('/', $indexHandle); - $this->getConnection()->delete(UrlHelper::buildUrl(Urls::URL_INDEX, [$handle[0], $handle[1]])); + if ($indexHandle === null) { + $handle = explode('/', $collection); + } else { + $handle = [ $this->makeCollection($collection), $indexHandle ]; + } + + if (count($handle) > 2) { + throw new ClientException('Invalid index handle'); + } + + $this->getConnection()->delete(UrlHelper::buildUrl(Urls::URL_INDEX, $handle)); return true; } + + + /** + * Get the responsible shard for a document + * + * @throws Exception + * + * @param mixed $collection - collection as string or object + * @param mixed $document - document + * + * @return string - shard id + * @since 3.5 + */ + public function getResponsibleShard($collection, $document) + { + if (is_array($document)) { + $data = $document; + } else { + $data = $document->getAll(['_includeInternals' => true ]); + } + + $collection = $this->makeCollection($collection); + $url = UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collection, self::OPTION_RESPONSIBLE_SHARD]); + $response = $this->getConnection()->put($url, $this->json_encode_wrapper($data)); + $data = $response->getJson(); + + return $data['shardId']; + } + + + /** + * Get the shards of a collection + * + * @throws Exception + * + * @param mixed $collection - collection as string or object + * + * @return array - array with shard ids + * @since 3.5 + */ + public function getShards($collection) + { + $collection = $this->makeCollection($collection); + $url = UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collection, self::OPTION_SHARDS]); + $response = $this->getConnection()->get($url); + $data = $response->getJson(); + + return $data['shards']; + } /** * Get a random document from the collection. * * This will throw if the document cannot be fetched from the server * - * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * * @return Document - the document fetched from the server * @since 1.2 */ - public function any($collectionId) + public function any($collection) { $_documentClass = $this->_documentClass; $data = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), ]; $response = $this->getConnection()->put(Urls::URL_ANY, $this->json_encode_wrapper($data)); @@ -1190,7 +1283,7 @@ public function any($collectionId) /** * Returns all documents of a collection * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param array $options - optional array of options. *

    Options are :
    *

  • '_sanitize' - True to remove _id and _rev attributes from result documents. Defaults to false.
  • @@ -1211,10 +1304,10 @@ public function any($collectionId) * @throws \ArangoDBClient\Exception * @throws \ArangoDBClient\ClientException */ - public function all($collectionId, array $options = []) + public function all($collection, array $options = []) { $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), ]; $body = $this->includeOptionsInBody( @@ -1225,6 +1318,8 @@ public function all($collectionId, array $options = []) self::OPTION_SKIP => null, ] ); + + $body[self::OPTION_STREAM] = true; $response = $this->getConnection()->put(Urls::URL_ALL, $this->json_encode_wrapper($body)); @@ -1278,7 +1373,7 @@ public function getAllIds($collection) * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param mixed $document - the example document as a Document object or an array * @param array $options - optional, prior to v1.0.0 this was a boolean value for sanitize, since v1.0.0 it's an array of options. *

    Options are :
    @@ -1297,7 +1392,7 @@ public function getAllIds($collection) * * @return cursor - Returns a cursor containing the result */ - public function byExample($collectionId, $document, array $options = []) + public function byExample($collection, $document, array $options = []) { $_documentClass = $this->_documentClass; @@ -1310,7 +1405,7 @@ public function byExample($collectionId, $document, array $options = []) } $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_EXAMPLE => $document->getAllAsObject(['_ignoreHiddenAttributes' => true]) ]; @@ -1347,7 +1442,7 @@ public function byExample($collectionId, $document, array $options = []) * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param mixed $document - the example document as a Document object or an array * @param array $options - optional, an array of options. *

    Options are :
    @@ -1364,7 +1459,7 @@ public function byExample($collectionId, $document, array $options = []) * @return Document - the document fetched from the server * @since 1.2 */ - public function firstExample($collectionId, $document, array $options = []) + public function firstExample($collection, $document, array $options = []) { $_documentClass = $this->_documentClass; @@ -1377,7 +1472,7 @@ public function firstExample($collectionId, $document, array $options = []) } $data = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_EXAMPLE => $document->getAll(['_ignoreHiddenAttributes' => true]) ]; @@ -1423,12 +1518,14 @@ public function firstExample($collectionId, $document, array $options = []) *

  • 'index' - If given, the identifier of the fulltext-index to use.
  • *

    * + * @deprecated use AQL queries instead + * * @return cursor - Returns a cursor containing the result */ public function fulltext($collection, $attribute, $query, array $options = []) { $body = [ - self::OPTION_COLLECTION => $collection, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_ATTRIBUTE => $attribute, self::OPTION_QUERY => $query, ]; @@ -1465,7 +1562,7 @@ public function fulltext($collection, $attribute, $query, array $options = []) * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or number * @param mixed $example - the example document as a Document object or an array * @param mixed $newValue - patch document or array which contains the attributes and values to be updated * @param mixed $options - optional, array of options (see below) or the boolean value for $policy (for compatibility prior to version 1.1 of this method) @@ -1475,10 +1572,12 @@ public function fulltext($collection, $attribute, $query, array $options = []) *
  • 'limit' - can be used set a limit on how many documents to update at most. If limit is specified but is less than the number of documents in the collection, it is undefined which of the documents will be updated.
  • *

    * + * @deprecated use AQL queries instead + * * @return bool - always true, will throw if there is an error * @since 1.2 */ - public function updateByExample($collectionId, $example, $newValue, array $options = []) + public function updateByExample($collection, $example, $newValue, array $options = []) { $_documentClass = $this->_documentClass; @@ -1491,7 +1590,7 @@ public function updateByExample($collectionId, $example, $newValue, array $optio } $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_EXAMPLE => $example->getAllAsObject(['_ignoreHiddenAttributes' => true]), self::OPTION_NEW_VALUE => $newValue->getAllAsObject(['_ignoreHiddenAttributes' => true]) ]; @@ -1529,7 +1628,7 @@ public function updateByExample($collectionId, $example, $newValue, array $optio * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param mixed $example - the example document as a Document object or an array * @param mixed $newValue - patch document or array which contains the attributes and values to be replaced * @param mixed $options - optional, array of options (see below) or the boolean value for $policy (for compatibility prior to version 1.1 of this method) @@ -1539,10 +1638,12 @@ public function updateByExample($collectionId, $example, $newValue, array $optio *
  • 'limit' - can be used set a limit on how many documents to replace at most. If limit is specified but is less than the number of documents in the collection, it is undefined which of the documents will be replaced.
  • *

    * + * @deprecated use AQL queries instead + * * @return bool - always true, will throw if there is an error * @since 1.2 */ - public function replaceByExample($collectionId, $example, $newValue, array $options = []) + public function replaceByExample($collection, $example, $newValue, array $options = []) { $_documentClass = $this->_documentClass; @@ -1555,7 +1656,7 @@ public function replaceByExample($collectionId, $example, $newValue, array $opti } $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_EXAMPLE => $example->getAllAsObject(['_ignoreHiddenAttributes' => true]), self::OPTION_NEW_VALUE => $newValue->getAllAsObject(['_ignoreHiddenAttributes' => true]) ]; @@ -1591,7 +1692,7 @@ public function replaceByExample($collectionId, $example, $newValue, array $opti * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param mixed $document - the example document as a Document object or an array * @param array $options - optional - an array of options. *

    Options are :
    @@ -1606,7 +1707,7 @@ public function replaceByExample($collectionId, $example, $newValue, array $opti * * @since 1.2 */ - public function removeByExample($collectionId, $document, array $options = []) + public function removeByExample($collection, $document, array $options = []) { $_documentClass = $this->_documentClass; @@ -1619,7 +1720,7 @@ public function removeByExample($collectionId, $document, array $options = []) } $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_EXAMPLE => $document->getAllAsObject(['_ignoreHiddenAttributes' => true]) ]; @@ -1652,7 +1753,7 @@ public function removeByExample($collectionId, $document, array $options = []) * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param array $keys - array of document keys * @param array $options - optional - an array of options. *

    Options are :
    @@ -1666,10 +1767,10 @@ public function removeByExample($collectionId, $document, array $options = []) * * @since 2.6 */ - public function removeByKeys($collectionId, array $keys, array $options = []) + public function removeByKeys($collection, array $keys, array $options = []) { $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_KEYS => $keys ]; @@ -1705,7 +1806,7 @@ public function removeByKeys($collectionId, array $keys, array $options = []) * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param array $keys - array of document keys * @param array $options - optional array of options. *

    Options are :
    @@ -1718,12 +1819,12 @@ public function removeByKeys($collectionId, array $keys, array $options = []) * * @since 2.6 */ - public function lookupByKeys($collectionId, array $keys, array $options = []) + public function lookupByKeys($collection, array $keys, array $options = []) { $_documentClass = $this->_documentClass; $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_KEYS => $keys ]; @@ -1748,7 +1849,7 @@ public function lookupByKeys($collectionId, array $keys, array $options = []) * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param string $attribute - the attribute path , like 'a', 'a.b', etc... * @param mixed $left - The lower bound. * @param mixed $right - The upper bound. @@ -1769,9 +1870,11 @@ public function lookupByKeys($collectionId, array $keys, array $options = []) * *

    * + * @deprecated use AQL queries instead + * * @return Cursor - documents matching the example [0...n] */ - public function range($collectionId, $attribute, $left, $right, array $options = []) + public function range($collection, $attribute, $left, $right, array $options = []) { if ($attribute === '') { throw new ClientException('Invalid attribute specification'); @@ -1783,7 +1886,7 @@ public function range($collectionId, $attribute, $left, $right, array $options = } $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_ATTRIBUTE => $attribute, self::OPTION_LEFT => $left, self::OPTION_RIGHT => $right @@ -1812,10 +1915,9 @@ public function range($collectionId, $attribute, $left, $right, array $options = * * This will throw if the list cannot be fetched from the server * - * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param double $latitude - The latitude of the coordinate. * @param double $longitude - The longitude of the coordinate. * @param array $options - optional array of options. @@ -1835,12 +1937,14 @@ public function range($collectionId, $attribute, $left, $right, array $options = * *

    * + * @deprecated use AQL queries instead + * * @return Cursor - documents matching the example [0...n] */ - public function near($collectionId, $latitude, $longitude, array $options = []) + public function near($collection, $latitude, $longitude, array $options = []) { $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_LATITUDE => $latitude, self::OPTION_LONGITUDE => $longitude ]; @@ -1871,7 +1975,7 @@ public function near($collectionId, $latitude, $longitude, array $options = []) * * @throws Exception * - * @param mixed $collectionId - collection id as string or number + * @param mixed $collection - collection as string or object * @param double $latitude - The latitude of the coordinate. * @param double $longitude - The longitude of the coordinate. * @param int $radius - The maximal radius (in meters). @@ -1892,12 +1996,14 @@ public function near($collectionId, $latitude, $longitude, array $options = []) * *

    * + * @deprecated use AQL queries instead + * * @return Cursor - documents matching the example [0...n] */ - public function within($collectionId, $latitude, $longitude, $radius, array $options = []) + public function within($collection, $latitude, $longitude, $radius, array $options = []) { $body = [ - self::OPTION_COLLECTION => $collectionId, + self::OPTION_COLLECTION => $this->makeCollection($collection), self::OPTION_LATITUDE => $latitude, self::OPTION_LONGITUDE => $longitude, self::OPTION_RADIUS => $radius diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 6b408447..bc530ca7 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -762,6 +762,125 @@ public function testCreateAndDeleteSystemCollectionWithoutCreatingObject() $collectionHandler->drop($name, ['isSystem' => true]); } + + /** + * Creates an index using createIndex + */ + public function testCreateIndex() + { + $result = $this->collectionHandler->createIndex( + 'ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, [ + 'type' => 'hash', + 'name' => 'mr-hash', + 'fields' => ['a', 'b'], + 'unique' => true, + 'sparse' => true, + 'inBackground' => true + ] + ); + + $indices = $this->collectionHandler->getIndexes('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp); + + $indicesByIdentifiers = $indices['identifiers']; + + static::assertArrayHasKey($result['id'], $indicesByIdentifiers); + + $indexInfo = $indicesByIdentifiers[$result['id']]; + + static::assertEquals('hash', $indexInfo[CollectionHandler::OPTION_TYPE]); + static::assertEquals(['a', 'b'], $indexInfo['fields']); + static::assertTrue($indexInfo['unique']); + static::assertTrue($indexInfo['sparse']); + static::assertEquals('mr-hash', $indexInfo['name']); + } + + + /** + * Gets an index by id + */ + public function testGetIndexById() + { + $result = $this->collectionHandler->createIndex( + 'ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, [ + 'type' => 'persistent', + 'name' => 'abc', + 'fields' => ['b', 'a', 'c'], + 'unique' => false, + 'sparse' => true, + 'inBackground' => false + ] + ); + + $indexInfo = $this->collectionHandler->getIndex('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, $result['id']); + + static::assertEquals('persistent', $indexInfo[CollectionHandler::OPTION_TYPE]); + static::assertEquals(['b', 'a', 'c'], $indexInfo['fields']); + static::assertFalse($indexInfo['unique']); + static::assertTrue($indexInfo['sparse']); + static::assertEquals('abc', $indexInfo['name']); + } + + + /** + * Gets an index by name + */ + public function testGetIndexByName() + { + $result = $this->collectionHandler->createIndex( + 'ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, [ + 'type' => 'fulltext', + 'name' => 'this-is-an-index', + 'fields' => ['c'], + 'minLength' => 4, + ] + ); + + $indexInfo = $this->collectionHandler->getIndex('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, $result['id']); + + static::assertEquals('fulltext', $indexInfo[CollectionHandler::OPTION_TYPE]); + static::assertEquals(['c'], $indexInfo['fields']); + static::assertFalse($indexInfo['unique']); + static::assertTrue($indexInfo['sparse']); + static::assertEquals(4, $indexInfo['minLength']); + static::assertEquals('this-is-an-index', $indexInfo['name']); + } + + /** + * Drops an index by id + */ + public function testDropIndexById() + { + $result = $this->collectionHandler->createIndex( + 'ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, [ + 'type' => 'fulltext', + 'name' => 'this-is-an-index', + 'fields' => ['c'], + 'minLength' => 4, + ] + ); + + $result = $this->collectionHandler->dropIndex('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, $result['id']); + static::assertTrue($result); + } + + + /** + * Drops an index by name + */ + public function testDropIndexByName() + { + $result = $this->collectionHandler->createIndex( + 'ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, [ + 'type' => 'fulltext', + 'name' => 'this-is-an-index', + 'fields' => ['c'], + 'minLength' => 4, + ] + ); + + $result = $this->collectionHandler->dropIndex('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, 'this-is-an-index'); + static::assertTrue($result); + } /** * Create a geo index with 1 field and verify it by getting information about the index from the server @@ -1146,6 +1265,85 @@ public function testHasCollectionReturnsTrueIfCollectionExists() { static::assertTrue($this->collectionHandler->has('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp)); } + + + /** + * get shards + */ + public function testGetShards() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + $connection = $this->connection; + $collection = new Collection(); + $collectionHandler = new CollectionHandler($connection); + + $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; + + try { + $collectionHandler->drop($name); + } catch (Exception $e) { + //Silence the exception + } + + $collection->setName($name); + $collection->setNumberOfShards(5); + + $collectionHandler->create($collection); + + $shardIds = $collectionHandler->getShards($collection); + static::assertEquals(5, count($shardIds)); + + foreach ($shardIds as $shardId) { + static::assertTrue(is_string($shardId)); + } + } + + /** + * find responsible shard + */ + public function testGetResponsibleShard() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + $connection = $this->connection; + $collection = new Collection(); + $collectionHandler = new CollectionHandler($connection); + $documentHandler = new DocumentHandler($connection); + + $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; + + try { + $collectionHandler->drop($name); + } catch (Exception $e) { + //Silence the exception + } + + $collection->setName($name); + $collection->setNumberOfShards(5); + + $response = $collectionHandler->create($collection); + + $shardIds = $collectionHandler->getShards($collection); + + for ($i = 0; $i < 100; ++$i) { + $doc = new Document(); + $doc->setInternalKey('test' . $i); + + $documentHandler->save($collection, $doc); + + $responsible = $collectionHandler->getResponsibleShard($collection, $doc); + static::assertTrue(in_array($responsible, $shardIds)); + } + } public function tearDown() { From e5f686cd90150a202f0c7d277cf4af0857ef8a90 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 5 Aug 2019 17:38:57 +0200 Subject: [PATCH 018/101] update examples --- examples/aql-query.php | 69 ++++++++++++++++++++++++++++++++ examples/select.php | 39 ------------------ examples/streaming-aql-query.php | 54 +++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 39 deletions(-) create mode 100644 examples/aql-query.php delete mode 100644 examples/select.php create mode 100644 examples/streaming-aql-query.php diff --git a/examples/aql-query.php b/examples/aql-query.php new file mode 100644 index 00000000..1396eae3 --- /dev/null +++ b/examples/aql-query.php @@ -0,0 +1,69 @@ + null, + 'FOR u IN users FILTER u.id == @id RETURN u' => ['id' => 6], + 'FOR u IN users FILTER u.id == @id && u.name != @name RETURN u' => ['id' => 1, 'name' => 'fox'], +]; + + +try { + $connection = new Connection($connectionOptions); + $collectionHandler = new CollectionHandler($connection); + $documentHandler = new DocumentHandler($connection); + + // set up a document collection "testCollection" + $collection = new Collection('users'); + try { + $collectionHandler->create($collection); + } catch (\Exception $e) { + // collection may already exist - ignore this error for now + // + // make sure it is empty + $collectionHandler->truncate($collection); + } + + $docs = [ + Document::createFromArray(['name' => 'foo', 'id' => 1]), + Document::createFromArray(['name' => 'bar', 'id' => 2]), + Document::createFromArray(['name' => 'baz', 'id' => 3]), + Document::createFromArray(['name' => 'fox', 'id' => 4]), + Document::createFromArray(['name' => 'qaa', 'id' => 5]), + Document::createFromArray(['name' => 'qux', 'id' => 6]), + Document::createFromArray(['name' => 'quu', 'id' => 7]), + ]; + foreach ($docs as $doc) { + $documentHandler->save($collection, $doc); + } + + foreach ($statements as $query => $bindVars) { + $statement = new Statement($connection, [ + 'query' => $query, + 'count' => true, + 'batchSize' => 1000, + 'bindVars' => $bindVars, + 'sanitize' => true, + ] + ); + + echo 'RUNNING STATEMENT ' . $statement . PHP_EOL; + + $cursor = $statement->execute(); + foreach ($cursor->getAll() as $doc) { + echo '- RETURN VALUE: ' . json_encode($doc) . PHP_EOL; + } + + echo PHP_EOL; + } +} catch (ConnectException $e) { + print $e . PHP_EOL; +} catch (ServerException $e) { + print $e . PHP_EOL; +} catch (ClientException $e) { + print $e . PHP_EOL; +} diff --git a/examples/select.php b/examples/select.php deleted file mode 100644 index bc5ee880..00000000 --- a/examples/select.php +++ /dev/null @@ -1,39 +0,0 @@ - null, - 'for u in users filter u.id == @id return u' => ['id' => 6], - 'for u in users filter u.id == @id && u.name != @name return u' => ['id' => 1, 'name' => 'fox'], -]; - - -try { - $connection = new Connection($connectionOptions); - - foreach ($statements as $query => $bindVars) { - $statement = new Statement($connection, [ - 'query' => $query, - 'count' => true, - 'batchSize' => 1000, - 'bindVars' => $bindVars, - 'sanitize' => true, - ] - ); - - print $statement . "\n\n"; - - $cursor = $statement->execute(); - var_dump($cursor->getAll()); - } -} catch (ConnectException $e) { - print $e . PHP_EOL; -} catch (ServerException $e) { - print $e . PHP_EOL; -} catch (ClientException $e) { - print $e . PHP_EOL; -} diff --git a/examples/streaming-aql-query.php b/examples/streaming-aql-query.php new file mode 100644 index 00000000..749f18d5 --- /dev/null +++ b/examples/streaming-aql-query.php @@ -0,0 +1,54 @@ +create($collection); + } catch (\Exception $e) { + // collection may already exist - ignore this error for now + // + // make sure it is empty + $collectionHandler->truncate($collection); + } + + $statement = new Statement($connection, [ + 'query' => 'FOR i IN 1..10000 INSERT { _key: CONCAT("test", i) } INTO @@collection', + 'bindVars' => [ '@collection' => 'testCollection' ], + ]); + + $statement->execute(); + + echo 'COUNT AFTER AQL INSERT: ' . $collectionHandler->count($collection) . PHP_EOL; + + // next query has a potentially huge result - therefore set the "stream" flag + $statement = new Statement($connection, [ + 'query' => 'FOR doc IN @@collection RETURN doc', + 'bindVars' => [ '@collection' => 'testCollection' ], + 'stream' => true + ]); + + $cursor = $statement->execute(); + + $counter = 0; + foreach ($cursor as $document) { + ++$counter; + print '- DOCUMENT KEY: ' . $document->getKey() . PHP_EOL; + } + + print 'QUERY RETURNED ' . $counter . ' DOCUMENTS' . PHP_EOL; + +} catch (ConnectException $e) { + print $e . PHP_EOL; +} catch (ServerException $e) { + print $e . PHP_EOL; +} catch (ClientException $e) { + print $e . PHP_EOL; +} From c42e98fab90fe6f112d26bb4da8822df382c823c Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 6 Aug 2019 09:21:52 +0200 Subject: [PATCH 019/101] cosmetic changes --- CHANGELOG.md | 3 +++ lib/ArangoDBClient/DocumentHandler.php | 22 ++++++++++------------ tests/DocumentBasicTest.php | 4 ++-- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 320392ec..c513fb0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Release notes for the ArangoDB-PHP driver 3.5.x =============================================== +Made `DocumentHandler::save()` an alias for `DocumentHandler::insert()`, to more closely +match the function names used in arangosh/arangod. + Added support for streaming transactions (i.e. transactions that can be composed of multiple operations on the client side piece-by-piece without specifying the full transaction operations in advance). diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index 82ed19a7..b4121bfd 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -317,7 +317,7 @@ public function store(Document $document, $collection = null, array $options = [ /** - * save a document to a collection + * insert a document into a collection * * This will add the document to the collection and return the document's id * @@ -339,7 +339,7 @@ public function store(Document $document, $collection = null, array $options = [ * @return mixed - id of document created * @since 1.0 */ - public function save($collection, $document, array $options = []) + public function insert($collection, $document, array $options = []) { $headers = []; $this->addTransactionHeader($headers, $collection); @@ -409,11 +409,11 @@ public function save($collection, $document, array $options = []) /** * Insert a document into a collection * - * This is an alias for save(). + * This is an alias for insert(). */ - public function insert($collection, $document, array $options = []) + public function save($collection, $document, array $options = []) { - return $this->save($collection, $document, $options); + return $this->insert($collection, $document, $options); } /** @@ -548,9 +548,9 @@ protected function patch($url, $collection, $documentId, Document $document, arr /** * Replace an existing document in a collection, identified by the document itself * - * This will update the document on the server + * This will replace the document on the server * - * This will throw if the document cannot be updated + * This will throw if the document cannot be replaced * * If policy is set to error (locally or globally through the ConnectionOptions) * and the passed document has a _rev value set, the database will check @@ -558,10 +558,10 @@ protected function patch($url, $collection, $documentId, Document $document, arr * * @throws Exception * - * @param Document $document - document to be updated + * @param Document $document - document to be replaced * @param array $options - optional, array of options *

    Options are : - *

  • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • + *
  • 'policy' - replace policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • *
  • 'waitForSync' - can be used to force synchronisation of the document update operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • *

    * @@ -569,9 +569,7 @@ protected function patch($url, $collection, $documentId, Document $document, arr */ public function replace(Document $document, array $options = []) { - $documentId = $this->getDocumentId($document); - - return $this->replaceById($document, $documentId, $document, $options); + return $this->replaceById($document, $this->getDocumentId($document), $document, $options); } diff --git a/tests/DocumentBasicTest.php b/tests/DocumentBasicTest.php index c92dd64a..dde3ef82 100644 --- a/tests/DocumentBasicTest.php +++ b/tests/DocumentBasicTest.php @@ -206,8 +206,8 @@ public function testCreateAndDeleteDocumentWithoutCreatedCollectionAndOptionCrea $document = new Document(); $documentHandler = new DocumentHandler($connection); - $options = $connection->getOptions(); - $connection->setOption(ConnectionOptions::OPTION_CREATE, true); + $options = $connection->getOptions(); + $connection->setOption(ConnectionOptions::OPTION_CREATE, true); try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); From a43168442c0e12268955fe88bff4d97be82c4b0b Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 6 Aug 2019 09:47:43 +0200 Subject: [PATCH 020/101] cleanup --- lib/ArangoDBClient/CollectionHandler.php | 17 ++++---------- lib/ArangoDBClient/DocumentHandler.php | 29 +++++++----------------- lib/ArangoDBClient/EdgeHandler.php | 10 ++++---- lib/ArangoDBClient/Handler.php | 2 +- tests/CollectionExtendedTest.php | 1 + 5 files changed, 21 insertions(+), 38 deletions(-) diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index 6f653fe9..63e2471c 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -832,7 +832,10 @@ public function import($collection, $importData, array $options = []) $options['type'] = 'documents'; } - $this->createCollectionIfOptions($collection, $options); + if ((isset($options['createCollection']) && $options['createCollection']) || + $this->getConnection()->getOption(ConnectionOptions::OPTION_CREATE)) { + $this->lazyCreateCollection($collection, $options); + } $params = array_merge( [self::OPTION_COLLECTION => $collection], @@ -2030,18 +2033,8 @@ public function within($collection, $latitude, $longitude, $radius, array $optio * @param $collection * @param $options */ - private function createCollectionIfOptions($collection, $options) + private function lazyCreateCollection($collection, $options) { - if (!array_key_exists(CollectionHandler::OPTION_CREATE_COLLECTION, $options)) { - return; - } - - $value = (bool) $options[CollectionHandler::OPTION_CREATE_COLLECTION]; - - if (!$value) { - return; - } - $collectionOptions = []; if (isset($options['createCollectionType'])) { if ($options['createCollectionType'] === 'edge' || diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index b4121bfd..dceb3b5f 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -351,14 +351,16 @@ public function insert($collection, $document, array $options = []) $options, [ 'waitForSync' => null, 'silent' => false, - 'createCollection' => $this->getConnection()->getOption(ConnectionOptions::OPTION_CREATE), 'overwrite' => (bool) @$options[self::OPTION_OVERWRITE], 'returnOld' => (bool) @$options[self::OPTION_RETURN_OLD], 'returnNew' => (bool) @$options[self::OPTION_RETURN_NEW], ] ); - $this->createCollectionIfOptions($collection, $params); + if ((isset($options['createCollection']) && $options['createCollection']) || + $this->getConnection()->getOption(ConnectionOptions::OPTION_CREATE)) { + $this->lazyCreateCollection($collection, $params); + } $url = UrlHelper::appendParamsUrl(Urls::URL_DOCUMENT . '/' . $collection, $params); @@ -394,6 +396,7 @@ public function insert($collection, $document, array $options = []) $id = UrlHelper::getDocumentIdFromLocation($location); + $document->setInternalKey($json[$_documentClass::ENTRY_KEY]); $document->setInternalId($json[$_documentClass::ENTRY_ID]); $document->setRevision($json[$_documentClass::ENTRY_REV]); @@ -683,11 +686,7 @@ protected function put($url, $collection, $documentId, Document $document, array */ public function remove(Document $document, array $options = []) { - $documentId = $this->getDocumentId($document); - - $revision = $this->getRevision($document); - - return $this->removeById($document, $documentId, $revision, $options); + return $this->removeById($document, $this->getDocumentId($document), $this->getRevision($document), $options); } @@ -819,28 +818,16 @@ private function getRevision($document) /** - * @param $collection mixed collection name or id + * @param mixed $collection collection name or id * @param array $options - optional, array of options *

    Options are : - *

  • 'createCollection' - true to create the collection if it does not exist
  • *
  • 'createCollectionType' - "document" or 2 for document collection
  • *
  • "edge" or 3 for edge collection
  • *
  • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
  • *

    */ - protected function createCollectionIfOptions($collection, $options) + protected function lazyCreateCollection($collection, $options) { - - if (!array_key_exists(CollectionHandler::OPTION_CREATE_COLLECTION, $options)) { - return; - } - - $value = (bool) $options[CollectionHandler::OPTION_CREATE_COLLECTION]; - - if (!$value) { - return; - } - $collectionHandler = new CollectionHandler($this->getConnection()); $params = []; diff --git a/lib/ArangoDBClient/EdgeHandler.php b/lib/ArangoDBClient/EdgeHandler.php index b825d460..a1d7fabc 100644 --- a/lib/ArangoDBClient/EdgeHandler.php +++ b/lib/ArangoDBClient/EdgeHandler.php @@ -151,11 +151,13 @@ public function saveEdge($collection, $from, $to, $document, array $options = [] $params = $this->includeOptionsInParams( $options, [ 'waitForSync' => $this->getConnectionOption(ConnectionOptions::OPTION_WAIT_SYNC), - 'createCollection' => $this->getConnectionOption(ConnectionOptions::OPTION_CREATE) ] ); - $this->createCollectionIfOptions($collection, $params); + if ((isset($options['createCollection']) && $options['createCollection']) || + $this->getConnection()->getOption(ConnectionOptions::OPTION_CREATE)) { + $this->lazyCreateCollection($collection, $params); + } $data = $document->getAllForInsertUpdate(); @@ -265,10 +267,10 @@ public function outEdges($collection, $vertexHandle) *
  • "edge" or 3 for edge collection
  • *

    */ - protected function createCollectionIfOptions($collection, $options) + protected function lazyCreateCollection($collection, $options) { $options['createCollectionType'] = 3; - parent::createCollectionIfOptions($collection, $options); + parent::lazyCreateCollection($collection, $options); } } diff --git a/lib/ArangoDBClient/Handler.php b/lib/ArangoDBClient/Handler.php index e772dc58..ab5a8e22 100644 --- a/lib/ArangoDBClient/Handler.php +++ b/lib/ArangoDBClient/Handler.php @@ -111,7 +111,7 @@ protected function includeOptionsInParams($options, array $includeArray = []) } } - foreach ($includeArray as $key => $value) { + foreach ($includeArray as $key => $value) { if (!array_key_exists($key, $options)) { if ($key === ConnectionOptions::OPTION_UPDATE_POLICY) { UpdatePolicy::validate($value); diff --git a/tests/CollectionExtendedTest.php b/tests/CollectionExtendedTest.php index e1927961..7063562d 100644 --- a/tests/CollectionExtendedTest.php +++ b/tests/CollectionExtendedTest.php @@ -848,6 +848,7 @@ public function testCreateDocumentsWithCreateFromArrayGetAsArrayAndRemoveByExamp static::assertArrayHasKey('_rev', $array[0]); unset($array[0]['_key'], $array[0]['_id'], $array[0]['_rev']); + unset($documentArray['_key']); static::assertSame($documentArray, $array[0]); } From 4dc9fd2946e329c08be1ebe7f9c8bd59e772039d Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 8 Aug 2019 10:31:04 +0200 Subject: [PATCH 021/101] disable some tests with mmfiles to avoid hangs --- tests/CollectionBasicTest.php | 2 -- tests/StreamingTransactionTest.php | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index bc530ca7..0b9d715b 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -39,8 +39,6 @@ public function setUp() $this->collectionHandler->create('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp); $adminHandler = new AdminHandler($this->connection); - $version = preg_replace('/-[a-z0-9]+$/', '', $adminHandler->getServerVersion()); - $this->isMMFilesEngine = ($adminHandler->getEngine()["name"] == "mmfiles"); } diff --git a/tests/StreamingTransactionTest.php b/tests/StreamingTransactionTest.php index d0a198bd..18a50ce7 100644 --- a/tests/StreamingTransactionTest.php +++ b/tests/StreamingTransactionTest.php @@ -299,6 +299,9 @@ public function testGetCollection() public function testInsert() { + if ($this->isMMFilesEngine) { + $this->markTestSkipped("test is only meaningful with the rocksdb engine"); + } $trx = new StreamingTransaction($this->connection, [ TransactionBase::ENTRY_COLLECTIONS => [ TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] @@ -342,6 +345,9 @@ public function testInsert() public function testRemove() { + if ($this->isMMFilesEngine) { + $this->markTestSkipped("test is only meaningful with the rocksdb engine"); + } // insert a document before the transaction $documentHandler = new DocumentHandler($this->connection); $result = $documentHandler->save($this->collection1->getName(), [ '_key' => 'test', 'value' => 'test' ]); @@ -400,6 +406,9 @@ public function testRemove() public function testUpdate() { + if ($this->isMMFilesEngine) { + $this->markTestSkipped("test is only meaningful with the rocksdb engine"); + } // insert a document before the transaction $documentHandler = new DocumentHandler($this->connection); $result = $documentHandler->save($this->collection1->getName(), [ '_key' => 'test', 'value' => 'test' ]); @@ -450,6 +459,9 @@ public function testUpdate() public function testReplace() { + if ($this->isMMFilesEngine) { + $this->markTestSkipped("test is only meaningful with the rocksdb engine"); + } // insert a document before the transaction $documentHandler = new DocumentHandler($this->connection); $result = $documentHandler->save($this->collection1->getName(), [ '_key' => 'test', 'value' => 'test' ]); @@ -504,6 +516,9 @@ public function testReplace() public function testTruncate() { + if ($this->isMMFilesEngine) { + $this->markTestSkipped("test is only meaningful with the rocksdb engine"); + } $stmt = new Statement($this->connection, [ 'query' => 'FOR i IN 1..10 INSERT { _key: CONCAT("test", i), value: i } INTO @@collection', 'bindVars' => [ '@collection' => $this->collection1->getName() ] @@ -554,6 +569,9 @@ public function testTruncate() public function testQuery() { + if ($this->isMMFilesEngine) { + $this->markTestSkipped("test is only meaningful with the rocksdb engine"); + } $trx = new StreamingTransaction($this->connection, [ TransactionBase::ENTRY_COLLECTIONS => [ TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] From 652081cf3f85c7962334ed93bfa164039a2171cf Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 9 Aug 2019 17:29:04 +0200 Subject: [PATCH 022/101] added "cafile" option --- lib/ArangoDBClient/ConnectionOptions.php | 6 ++++++ lib/ArangoDBClient/HttpHelper.php | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/lib/ArangoDBClient/ConnectionOptions.php b/lib/ArangoDBClient/ConnectionOptions.php index 41c08a7f..f68dd1df 100644 --- a/lib/ArangoDBClient/ConnectionOptions.php +++ b/lib/ArangoDBClient/ConnectionOptions.php @@ -99,6 +99,11 @@ class ConnectionOptions implements \ArrayAccess * "allow self-signed" index constant */ const OPTION_ALLOW_SELF_SIGNED = 'allowSelfSigned'; + + /** + * "caFile" index constant + */ + const OPTION_CA_FILE = 'caFile'; /** * ciphers allowed to be used in SSL @@ -460,6 +465,7 @@ private static function getDefaults() self::OPTION_VERIFY_CERT => DefaultValues::DEFAULT_VERIFY_CERT, self::OPTION_VERIFY_CERT_NAME => DefaultValues::DEFAULT_VERIFY_CERT_NAME, self::OPTION_ALLOW_SELF_SIGNED => DefaultValues::DEFAULT_ALLOW_SELF_SIGNED, + self::OPTION_CA_FILE => null, self::OPTION_CIPHERS => DefaultValues::DEFAULT_CIPHERS, self::OPTION_AUTH_USER => null, self::OPTION_AUTH_PASSWD => null, diff --git a/lib/ArangoDBClient/HttpHelper.php b/lib/ArangoDBClient/HttpHelper.php index b138633e..7395e5fe 100644 --- a/lib/ArangoDBClient/HttpHelper.php +++ b/lib/ArangoDBClient/HttpHelper.php @@ -89,6 +89,10 @@ public static function createConnection(ConnectionOptions $options) stream_context_set_option($context, 'ssl', 'verify_peer', $options[ConnectionOptions::OPTION_VERIFY_CERT]); @stream_context_set_option($context, 'ssl', 'verify_peer_name', $options[ConnectionOptions::OPTION_VERIFY_CERT_NAME]); stream_context_set_option($context, 'ssl', 'allow_self_signed', $options[ConnectionOptions::OPTION_ALLOW_SELF_SIGNED]); + + if (is_string(@$options[ConnectionOptions::OPTION_CA_FILE])) { + stream_context_set_option($context, 'ssl', 'cafile', $options[ConnectionOptions::OPTION_CA_FILE]); + } if ($options[ConnectionOptions::OPTION_CIPHERS] !== null) { // SSL ciphers From 939a7e675a7de23bb138a417fa5a184ed5e254ad Mon Sep 17 00:00:00 2001 From: max Date: Mon, 19 Aug 2019 13:59:57 +0200 Subject: [PATCH 023/101] generate 3.5 documentation --- docs/classes.svg | 752 +- docs/classes/ArangoDBClient.AdminHandler.html | 26 +- .../ArangoDBClient.AqlUserFunction.html | 62 +- docs/classes/ArangoDBClient.Autoloader.html | 6 +- docs/classes/ArangoDBClient.Batch.html | 6 +- docs/classes/ArangoDBClient.BatchPart.html | 6 +- docs/classes/ArangoDBClient.BindVars.html | 6 +- .../ArangoDBClient.ClientException.html | 6 +- docs/classes/ArangoDBClient.Collection.html | 151 +- .../ArangoDBClient.CollectionHandler.html | 481 +- .../ArangoDBClient.ConnectException.html | 6 +- docs/classes/ArangoDBClient.Connection.html | 6 +- .../ArangoDBClient.ConnectionOptions.html | 13 +- docs/classes/ArangoDBClient.Cursor.html | 6 +- docs/classes/ArangoDBClient.Database.html | 6 +- .../classes/ArangoDBClient.DefaultValues.html | 6 +- docs/classes/ArangoDBClient.Document.html | 13 +- .../ArangoDBClient.DocumentClassable.html | 6 +- .../ArangoDBClient.DocumentHandler.html | 159 +- docs/classes/ArangoDBClient.Edge.html | 13 +- .../ArangoDBClient.EdgeDefinition.html | 6 +- docs/classes/ArangoDBClient.EdgeHandler.html | 211 +- docs/classes/ArangoDBClient.Endpoint.html | 6 +- docs/classes/ArangoDBClient.Exception.html | 6 +- docs/classes/ArangoDBClient.Export.html | 6 +- docs/classes/ArangoDBClient.ExportCursor.html | 6 +- .../ArangoDBClient.FailoverException.html | 6 +- docs/classes/ArangoDBClient.FoxxHandler.html | 26 +- docs/classes/ArangoDBClient.Graph.html | 13 +- docs/classes/ArangoDBClient.GraphHandler.html | 26 +- docs/classes/ArangoDBClient.Handler.html | 26 +- docs/classes/ArangoDBClient.HttpHelper.html | 6 +- docs/classes/ArangoDBClient.HttpResponse.html | 6 +- .../ArangoDBClient.QueryCacheHandler.html | 26 +- docs/classes/ArangoDBClient.QueryHandler.html | 26 +- .../ArangoDBClient.ServerException.html | 6 +- docs/classes/ArangoDBClient.Statement.html | 24 +- .../ArangoDBClient.StreamingTransaction.html | 679 + ...Client.StreamingTransactionCollection.html | 1211 + ...oDBClient.StreamingTransactionHandler.html | 509 + docs/classes/ArangoDBClient.TraceRequest.html | 6 +- .../classes/ArangoDBClient.TraceResponse.html | 6 +- docs/classes/ArangoDBClient.Transaction.html | 303 +- .../ArangoDBClient.TransactionBase.html | 524 + docs/classes/ArangoDBClient.Traversal.html | 6 +- docs/classes/ArangoDBClient.UpdatePolicy.html | 6 +- docs/classes/ArangoDBClient.UrlHelper.html | 6 +- docs/classes/ArangoDBClient.Urls.html | 6 +- docs/classes/ArangoDBClient.User.html | 13 +- docs/classes/ArangoDBClient.UserHandler.html | 26 +- .../ArangoDBClient.ValueValidator.html | 6 +- docs/classes/ArangoDBClient.Vertex.html | 13 +- .../classes/ArangoDBClient.VertexHandler.html | 157 +- docs/classes/ArangoDBClient.View.html | 6 +- docs/classes/ArangoDBClient.ViewHandler.html | 26 +- docs/deprecated.html | 82 +- docs/errors.html | 281 +- docs/graph_class.html | 6 +- docs/index.html | 10 +- docs/markers.html | 6 +- docs/namespaces/ArangoDBClient.html | 108 +- docs/packages/ArangoDBClient.html | 108 +- docs/packages/Default.html | 6 +- docs/packages/global.html | 6 +- docs/structure.xml | 38835 +++++++++------- 65 files changed, 26350 insertions(+), 18775 deletions(-) create mode 100644 docs/classes/ArangoDBClient.StreamingTransaction.html create mode 100644 docs/classes/ArangoDBClient.StreamingTransactionCollection.html create mode 100644 docs/classes/ArangoDBClient.StreamingTransactionHandler.html create mode 100644 docs/classes/ArangoDBClient.TransactionBase.html diff --git a/docs/classes.svg b/docs/classes.svg index 414d1431..10d07f74 100644 --- a/docs/classes.svg +++ b/docs/classes.svg @@ -4,486 +4,534 @@ - - + + G - + cluster_Global - -Global + +Global cluster_\ArangoDBClient - -ArangoDBClient + +ArangoDBClient - + -\\ArangoDBClient\\AqlUserFunction - -AqlUserFunction +\\ArangoDBClient\\Edge + +Edge - + + +\\ArangoDBClient\\Document + +Document + + + +\\ArangoDBClient\\Edge->\\ArangoDBClient\\Document + + + + -\\ArangoDBClient\\ViewHandler - -ViewHandler +\\ArangoDBClient\\Transaction + +Transaction - - -\\ArangoDBClient\\Handler - -«abstract» -Handler + + +\\ArangoDBClient\\TransactionBase + +TransactionBase - - -\\ArangoDBClient\\ViewHandler->\\ArangoDBClient\\Handler - - + + +\\ArangoDBClient\\Transaction->\\ArangoDBClient\\TransactionBase + + - + -\\ArangoDBClient\\BatchPart - -BatchPart +\\ArangoDBClient\\StreamingTransaction + +StreamingTransaction - + + +\\ArangoDBClient\\StreamingTransaction->\\ArangoDBClient\\TransactionBase + + + + -\\ArangoDBClient\\View - -View +\\ArangoDBClient\\UrlHelper + +«abstract» +UrlHelper - + -\\ArangoDBClient\\UserHandler - -UserHandler - - - -\\ArangoDBClient\\UserHandler->\\ArangoDBClient\\Handler - - +\\ArangoDBClient\\Endpoint + +Endpoint - + -\\ArangoDBClient\\Document - -Document - - - -\\JsonSerializable - -\JsonSerializable - - - -\\ArangoDBClient\\Document->\\JsonSerializable - - +\\ArangoDBClient\\Batch + +Batch - + -\\ArangoDBClient\\ConnectionOptions - -ConnectionOptions +\\ArangoDBClient\\ExportCursor + +ExportCursor - - -\\ArrayAccess - -\ArrayAccess + + +\\ArangoDBClient\\FailoverException + +FailoverException - - -\\ArangoDBClient\\ConnectionOptions->\\ArrayAccess - - + + +\\ArangoDBClient\\Exception + +Exception - - -\\ArangoDBClient\\Connection - -Connection + + +\\ArangoDBClient\\FailoverException->\\ArangoDBClient\\Exception + + - + -\\ArangoDBClient\\Transaction - -Transaction +\\ArangoDBClient\\ConnectException + +ConnectException - + + +\\ArangoDBClient\\ConnectException->\\ArangoDBClient\\Exception + + + + -\\ArangoDBClient\\ExportCursor - -ExportCursor +\\ArangoDBClient\\Collection + +Collection - + -\\ArangoDBClient\\UrlHelper - -«abstract» -UrlHelper +\\ArangoDBClient\\TraceRequest + +TraceRequest - + -\\ArangoDBClient\\QueryCacheHandler - -QueryCacheHandler - - - -\\ArangoDBClient\\QueryCacheHandler->\\ArangoDBClient\\Handler - - +\\ArangoDBClient\\AqlUserFunction + +AqlUserFunction - + -\\ArangoDBClient\\DocumentHandler - -DocumentHandler - - - -\\ArangoDBClient\\DocumentHandler->\\ArangoDBClient\\Handler - - +\\ArangoDBClient\\Traversal + +Traversal - + -\\ArangoDBClient\\Edge - -Edge - - - -\\ArangoDBClient\\Edge->\\ArangoDBClient\\Document - - +\\ArangoDBClient\\View + +View - + -\\ArangoDBClient\\Cursor - -Cursor - - - -\\Iterator - -\Iterator - - - -\\ArangoDBClient\\Cursor->\\Iterator - - +\\ArangoDBClient\\DefaultValues + +«abstract» +DefaultValues - + -\\ArangoDBClient\\Database - -Database +\\ArangoDBClient\\User + +User - + + +\\ArangoDBClient\\User->\\ArangoDBClient\\Document + + + + -\\ArangoDBClient\\FailoverException - -FailoverException +\\ArangoDBClient\\CollectionHandler + +CollectionHandler - - -\\ArangoDBClient\\Exception - -Exception + + +\\ArangoDBClient\\Handler + +«abstract» +Handler - - -\\ArangoDBClient\\FailoverException->\\ArangoDBClient\\Exception - - + + +\\ArangoDBClient\\CollectionHandler->\\ArangoDBClient\\Handler + + - + -\\ArangoDBClient\\Batch - -Batch +\\ArangoDBClient\\Database + +Database - + -\\ArangoDBClient\\TraceRequest - -TraceRequest +\\ArangoDBClient\\StreamingTransactionHandler + +StreamingTransactionHandler - - -\\ArangoDBClient\\ConnectException - -ConnectException + + +\\ArangoDBClient\\StreamingTransactionHandler->\\ArangoDBClient\\Handler + + - - -\\ArangoDBClient\\ConnectException->\\ArangoDBClient\\Exception - - + + +\\ArangoDBClient\\BatchPart + +BatchPart - + -\\ArangoDBClient\\ValueValidator - -ValueValidator +\\ArangoDBClient\\FoxxHandler + +FoxxHandler - + + +\\ArangoDBClient\\FoxxHandler->\\ArangoDBClient\\Handler + + + + -\\ArangoDBClient\\Autoloader - -Autoloader +\\ArangoDBClient\\Connection + +Connection - + -\\ArangoDBClient\\ClientException - -ClientException +\\ArangoDBClient\\TraceResponse + +TraceResponse - + + +\\ArangoDBClient\\Autoloader + +Autoloader + + + +\\ArangoDBClient\\ServerException + +ServerException + + + +\\ArangoDBClient\\ServerException->\\ArangoDBClient\\Exception + + + + + +\\ArangoDBClient\\UserHandler + +UserHandler + + -\\ArangoDBClient\\ClientException->\\ArangoDBClient\\Exception - - +\\ArangoDBClient\\UserHandler->\\ArangoDBClient\\Handler + + - - -\\ArangoDBClient\\FoxxHandler - -FoxxHandler + + +\\ArangoDBClient\\QueryCacheHandler + +QueryCacheHandler - + -\\ArangoDBClient\\FoxxHandler->\\ArangoDBClient\\Handler - - +\\ArangoDBClient\\QueryCacheHandler->\\ArangoDBClient\\Handler + + - - -\\ArangoDBClient\\User - -User + + +\\ArangoDBClient\\HttpHelper + +HttpHelper - + + +\\ArangoDBClient\\ViewHandler + +ViewHandler + + -\\ArangoDBClient\\User->\\ArangoDBClient\\Document - - +\\ArangoDBClient\\ViewHandler->\\ArangoDBClient\\Handler + + - - -\\ArangoDBClient\\BindVars - -BindVars + + +\\ArangoDBClient\\Cursor + +Cursor - - -\\ArangoDBClient\\CollectionHandler - -CollectionHandler + + +\\Iterator + +\Iterator - + -\\ArangoDBClient\\CollectionHandler->\\ArangoDBClient\\Handler - - +\\ArangoDBClient\\Cursor->\\Iterator + + - + \\ArangoDBClient\\Graph - -Graph + +Graph \\ArangoDBClient\\Graph->\\ArangoDBClient\\Document - - + + - - -\\ArangoDBClient\\EdgeDefinition - -EdgeDefinition + + +\\JsonSerializable + +\JsonSerializable + + + +\\ArangoDBClient\\Document->\\JsonSerializable + + - + \\ArangoDBClient\\Vertex - -Vertex + +Vertex - + \\ArangoDBClient\\Vertex->\\ArangoDBClient\\Document - - + + - - -\\ArangoDBClient\\Collection - -Collection + + +\\ArangoDBClient\\QueryHandler + +QueryHandler - - -\\ArangoDBClient\\HttpResponse - -HttpResponse + + +\\ArangoDBClient\\QueryHandler->\\ArangoDBClient\\Handler + + - - -\\ArangoDBClient\\HttpHelper - -HttpHelper + + +\\ArangoDBClient\\DocumentHandler + +DocumentHandler - - -\\ArangoDBClient\\UpdatePolicy - -UpdatePolicy + + +\\ArangoDBClient\\DocumentHandler->\\ArangoDBClient\\Handler + + + + + +\\ArangoDBClient\\Statement + +Statement - + \\Exception \Exception - + \\ArangoDBClient\\Exception->\\Exception - - - - - -\\ArangoDBClient\\Endpoint - -Endpoint - - - -\\ArangoDBClient\\QueryHandler - -QueryHandler - - - -\\ArangoDBClient\\QueryHandler->\\ArangoDBClient\\Handler - - - - - -\\ArangoDBClient\\ServerException - -ServerException - - - -\\ArangoDBClient\\ServerException->\\ArangoDBClient\\Exception - - - - - -\\ArangoDBClient\\Traversal - -Traversal + + - + \\ArangoDBClient\\VertexHandler - -VertexHandler + +VertexHandler - + \\ArangoDBClient\\VertexHandler->\\ArangoDBClient\\DocumentHandler - - + + - + + +\\ArangoDBClient\\HttpResponse + +HttpResponse + + -\\ArangoDBClient\\Statement - -Statement +\\ArangoDBClient\\BindVars + +BindVars - + -\\ArangoDBClient\\Urls - -«abstract» -Urls +\\ArangoDBClient\\UpdatePolicy + +UpdatePolicy - + -\\ArangoDBClient\\TraceResponse - -TraceResponse +\\ArangoDBClient\\Urls + +«abstract» +Urls - + -\\ArangoDBClient\\AdminHandler - -AdminHandler - - - -\\ArangoDBClient\\AdminHandler->\\ArangoDBClient\\Handler - - +\\ArangoDBClient\\EdgeDefinition + +EdgeDefinition - + -\\ArangoDBClient\\EdgeHandler - -EdgeHandler +\\ArangoDBClient\\ClientException + +ClientException - + -\\ArangoDBClient\\EdgeHandler->\\ArangoDBClient\\DocumentHandler - - +\\ArangoDBClient\\ClientException->\\ArangoDBClient\\Exception + + \\ArangoDBClient\\Export - -Export + +Export - + +\\ArangoDBClient\\ValueValidator + +ValueValidator + + + \\ArangoDBClient\\GraphHandler - -GraphHandler + +GraphHandler \\ArangoDBClient\\GraphHandler->\\ArangoDBClient\\Handler - - + + - - -\\ArangoDBClient\\DefaultValues - -«abstract» -DefaultValues + + +\\ArangoDBClient\\StreamingTransactionCollection + +StreamingTransactionCollection + + + +\\ArangoDBClient\\StreamingTransactionCollection->\\ArangoDBClient\\Collection + + + + + +\\ArangoDBClient\\AdminHandler + +AdminHandler + + + +\\ArangoDBClient\\AdminHandler->\\ArangoDBClient\\Handler + + + + + +\\ArangoDBClient\\EdgeHandler + +EdgeHandler + + + +\\ArangoDBClient\\EdgeHandler->\\ArangoDBClient\\DocumentHandler + + + + + +\\ArangoDBClient\\ConnectionOptions + +ConnectionOptions + + + +\\ArrayAccess + +\ArrayAccess + + + +\\ArangoDBClient\\ConnectionOptions->\\ArrayAccess + + - + \\ArangoDBClient\\DocumentClassable - -DocumentClassable + +DocumentClassable diff --git a/docs/classes/ArangoDBClient.AdminHandler.html b/docs/classes/ArangoDBClient.AdminHandler.html index c6a49f30..9615fe59 100644 --- a/docs/classes/ArangoDBClient.AdminHandler.html +++ b/docs/classes/ArangoDBClient.AdminHandler.html @@ -31,11 +31,11 @@ Reports @@ -82,6 +82,7 @@
  • Get an attribute, magic method
    __get()
  • Is triggered by calling isset() or empty() on inaccessible properties.
    __isset()
  • Set an attribute, magic method
    __set()
  • -
  • Returns the action string
    __toString()
  • Build the object's attributes from a given array
    buildAttributesFromArray()
  • Get an attribute
    get()
  • Get user function code
    getCode()
  • @@ -84,16 +83,12 @@ @@ -178,7 +178,7 @@

    Class file extension

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.Batch.html b/docs/classes/ArangoDBClient.Batch.html index eb7906ac..93fffb0d 100644 --- a/docs/classes/ArangoDBClient.Batch.html +++ b/docs/classes/ArangoDBClient.Batch.html @@ -31,11 +31,11 @@ Reports @@ -658,7 +658,7 @@

    Default

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.BatchPart.html b/docs/classes/ArangoDBClient.BatchPart.html index 8005d476..bddae259 100644 --- a/docs/classes/ArangoDBClient.BatchPart.html +++ b/docs/classes/ArangoDBClient.BatchPart.html @@ -31,11 +31,11 @@ Reports @@ -424,7 +424,7 @@

    Default

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.BindVars.html b/docs/classes/ArangoDBClient.BindVars.html index 9f87ab06..64fac2ce 100644 --- a/docs/classes/ArangoDBClient.BindVars.html +++ b/docs/classes/ArangoDBClient.BindVars.html @@ -31,11 +31,11 @@ Reports @@ -188,7 +188,7 @@

    Default

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.ClientException.html b/docs/classes/ArangoDBClient.ClientException.html index 7a6dfef2..6b2f07d5 100644 --- a/docs/classes/ArangoDBClient.ClientException.html +++ b/docs/classes/ArangoDBClient.ClientException.html @@ -31,11 +31,11 @@ Reports @@ -179,7 +179,7 @@

    Default

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.Collection.html b/docs/classes/ArangoDBClient.Collection.html index 8dcf1f56..af37d641 100644 --- a/docs/classes/ArangoDBClient.Collection.html +++ b/docs/classes/ArangoDBClient.Collection.html @@ -31,11 +31,11 @@ Reports @@ -67,30 +67,36 @@
  • Factory method to construct a new collection
    createFromArray()
  • Get all collection attributes
    getAll()
  • Get the default collection type
    getDefaultType()
  • +
  • Get the distributeShardsLike (if already known)
    getDistributeShardsLike()
  • Get the collection id (if already known)
    getId()
  • Get the isSystem value (if already known)
    getIsSystem()
  • Get the isVolatile value (if already known)
    getIsVolatile()
  • Get the journalSize value (if already known)
    getJournalSize()
  • Get the collection key options (if already known)
    getKeyOptions()
  • +
  • Get the minReplicationFactor value (if already known)
    getMinReplicationFactor()
  • Get the collection name (if already known)
    getName()
  • Get the numberOfShards value (if already known)
    getNumberOfShards()
  • Get the replicationFactor value (if already known)
    getReplicationFactor()
  • Get the shardKeys value (if already known)
    getShardKeys()
  • Get the sharding strategy value (if already known)
    getShardingStrategy()
  • +
  • Get the smart join attribute value (if already known)
    getSmartJoinAttribute()
  • Get the collection status (if already known)
    getStatus()
  • Get the collection type (if already known)
    getType()
  • Get the waitForSync value (if already known)
    getWaitForSync()
  • Set a collection attribute
    set()
  • +
  • Set the distribute shards like value
    setDistributeShardsLike()
  • Set the collection id
    setId()
  • Set the isSystem value
    setIsSystem()
  • Set the isVolatile value
    setIsVolatile()
  • Set the journalSize value
    setJournalSize()
  • Set the collection key options.
    setKeyOptions()
  • +
  • Set the minReplicationFactor value
    setMinReplicationFactor()
  • Set the collection name
    setName()
  • Set the numberOfShards value
    setNumberOfShards()
  • Set the replicationFactor value
    setReplicationFactor()
  • Set the shardKeys value
    setShardKeys()
  • -
  • Set the shardingStragy value
    setShardingStrategy()
  • +
  • Set the shardingStrategy value
    setShardingStrategy()
  • +
  • Set the smart join attribute value
    setSmartJoinAttribute()
  • Set the collection status.
    setStatus()
  • Set the collection type.
    setType()
  • Set the waitForSync value
    setWaitForSync()
  • @@ -104,16 +110,19 @@
  • Create a fulltext index
    createFulltextIndex()
  • Create a geo index
    createGeoIndex()
  • Create a hash index
    createHashIndex()
  • +
  • Creates an index on a collection on the server
    createIndex()
  • Create a persistent index
    createPersistentIndex()
  • Create a skip-list index
    createSkipListIndex()
  • +
  • Create a TTL index
    createTtlIndex()
  • Drop a collection
    drop()
  • Drop an index
    dropIndex()
  • Get figures for a collection
    figures()
  • @@ -86,7 +88,9 @@
  • Get the information about an index in a collection
    getIndex()
  • Get indexes of a collection
    getIndexes()
  • Get properties of a collection
    getProperties()
  • +
  • Get the responsible shard for a document
    getResponsibleShard()
  • Returns the Collections revision ID
    getRevision()
  • +
  • Get the shards of a collection
    getShards()
  • Check if a collection exists
    has()
  • Import documents into a collection
    import()
  • Import documents from a file
    importFromFile()
  • @@ -110,6 +114,7 @@
  • distance parameter
    OPTION_DISTANCE
  • example parameter
    OPTION_EXAMPLE
  • exclude system collections
    OPTION_EXCLUDE_SYSTEM
  • +
  • expireAfter option
    OPTION_EXPIRE_AFTER
  • fields
    OPTION_FIELDS
  • figures option
    OPTION_FIGURES
  • fulltext index option
    OPTION_FULLTEXT_INDEX
  • @@ -156,6 +162,7 @@
  • geo index option
    OPTION_GEO_INDEX
  • hash index option
    OPTION_HASH_INDEX
  • index parameter
    OPTION_INDEX
  • +
  • inBackground option
    OPTION_IN_BACKGROUND
  • keys parameter
    OPTION_KEYS
  • latitude parameter
    OPTION_LATITUDE
  • left parameter
    OPTION_LEFT
  • @@ -169,13 +176,17 @@
  • query option
    OPTION_QUERY
  • radius parameter
    OPTION_RADIUS
  • rename option
    OPTION_RENAME
  • +
  • responsible shard option
    OPTION_RESPONSIBLE_SHARD
  • revision option
    OPTION_REVISION
  • right parameter
    OPTION_RIGHT
  • +
  • shards option
    OPTION_SHARDS
  • size option
    OPTION_SIZE
  • skip parameter
    OPTION_SKIP
  • skiplist index option
    OPTION_SKIPLIST_INDEX
  • sparse index option
    OPTION_SPARSE
  • +
  • stream parameter
    OPTION_STREAM
  • truncate option
    OPTION_TRUNCATE
  • +
  • ttl index option
    OPTION_TTL_INDEX
  • type
    OPTION_TYPE
  • unique
    OPTION_UNIQUE
  • unload option
    OPTION_UNLOAD
  • @@ -230,15 +241,15 @@

    $connection

    Returns all documents of a collection

    -
    all(mixed $collectionId, array $options = array()) : \ArangoDBClient\Cursor
    +
    all(mixed $collection, array $options = array()) : \ArangoDBClient\Cursor

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $options

    @@ -276,7 +287,7 @@

    Returns

    Get a random document from the collection.

    -
    any(mixed $collectionId) : \ArangoDBClient\Document
    +
    any(mixed $collection) : \ArangoDBClient\Document

    This will throw if the document cannot be fetched from the server

    @@ -286,9 +297,9 @@

    Get a random document from the collection.

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    Exceptions

    @@ -302,15 +313,15 @@

    Returns

    Get document(s) by specifying an example

    -
    byExample(mixed $collectionId, mixed $document, array $options = array()) : \ArangoDBClient\cursor
    +
    byExample(mixed $collection, mixed $document, array $options = array()) : \ArangoDBClient\cursor

    This will throw if the list cannot be fetched from the server

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $document

    @@ -386,16 +397,19 @@

    $options

    array
    • an array of options.

      Options are :
      -

    • 'type' - 2 -> normal collection, 3 -> edge-collection
    • -
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • -
    • 'journalSize' - journalSize value.
    • -
    • 'isSystem' - false->user collection(default), true->system collection .
    • -
    • 'isVolatile' - false->persistent collection(default), true->volatile (in-memory) collection .
    • -
    • 'keyOptions' - key options to use.
    • -
    • 'numberOfShards' - number of shards for the collection.
    • -
    • 'shardKeys' - array of shard key attributes.
    • -
    • 'replicationFactor' - number of replicas to keep (default: 1).
    • -
    • 'shardingStrategy' - sharding strategy to use in cluster.
    • +
    • 'type' - 2 -> normal collection, 3 -> edge-collection
    • +
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • +
    • 'journalSize' - journalSize value.
    • +
    • 'isSystem' - false->user collection(default), true->system collection .
    • +
    • 'isVolatile' - false->persistent collection(default), true->volatile (in-memory) collection .
    • +
    • 'keyOptions' - key options to use.
    • +
    • 'distributeShardsLike' - name of prototype collection for identical sharding.
    • +
    • 'numberOfShards' - number of shards for the collection.
    • +
    • 'replicationFactor' - number of replicas to keep (default: 1).
    • +
    • 'minReplicationFactor' - minimum number of replicas to be successful when writing (default: 1).
    • +
    • 'shardKeys' - array of shard key attributes.
    • +
    • 'shardingStrategy' - sharding strategy to use in cluster.
    • +
    • 'smartJoinAttribute' - attribute name for smart joins (if not shard key).

    Exceptions

    @@ -410,19 +424,19 @@

    Returns

    Create a fulltext index

    -
    createFulltextIndex(string $collectionId, array $fields, integer $minLength = null) : array
    +
    createFulltextIndex(mixed $collection, array $fields, integer $minLength = null, boolean $inBackground = false) : array
    - - + +
    linkhttps://docs.arangodb.com/HTTP/Indexes/Fulltext.htmldeprecateduse CollectionHandler::createIndex instead

    Parameters

    -

    $collectionId

    -string
      -
    • the collection id
    • +

      $collection

      +mixed
        +
      • collection as string or object

    $fields

    @@ -434,6 +448,11 @@

    $minLength

    integer
    • the minimum length of words to index
    +
    +

    $inBackground

    +boolean
      +
    • true if index shall be created in background
    • +

    Exceptions

    @@ -446,19 +465,19 @@

    Returns

    Create a geo index

    -
    createGeoIndex(string $collectionId, array $fields, boolean $geoJson = null) : array
    +
    createGeoIndex(mixed $collection, array $fields, boolean $geoJson = null, boolean $inBackground = false) : array
    \ArangoDBClient\Exception
    - - + +
    linkhttps://docs.arangodb.com/HTTP/Indexes/Geo.htmldeprecateduse CollectionHandler::createIndex instead

    Parameters

    -

    $collectionId

    -string
      -
    • the collection id
    • +

      $collection

      +mixed
        +
      • collection as string or object

    $fields

    @@ -470,6 +489,11 @@

    $geoJson

    boolean
    • whether to use geoJson or not
    +
    +

    $inBackground

    +boolean
      +
    • true if index shall be created in background
    • +

    Exceptions

    @@ -482,19 +506,19 @@

    Returns

    Create a hash index

    -
    createHashIndex(string $collectionId, array $fields, boolean $unique = null, boolean $sparse = null) : array
    +
    createHashIndex(mixed $collection, array $fields, boolean $unique = null, boolean $sparse = null, boolean $inBackground = false) : array
    \ArangoDBClient\Exception
    - - + +
    linkhttps://docs.arangodb.com/HTTP/Indexes/Hash.htmldeprecateduse CollectionHandler::createIndex instead

    Parameters

    -

    $collectionId

    -string
      -
    • the collection id
    • +

      $collection

      +mixed
        +
      • the collection as name or object

    $fields

    @@ -511,6 +535,43 @@

    $sparse

    boolean
    • whether the index should be sparse
    +
    +

    $inBackground

    +boolean
      +
    • true if index shall be created in background
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\Exception
    +

    Returns

    +
    +array- server response of the created index
    +
    +
    +
    +

    Creates an index on a collection on the server

    +
    createIndex(mixed $collection, array $indexOptions) : array
    +
    +
    +

    This will create an index on the collection on the server and return its id

    +

    This will throw if the index cannot be created

    + + + +
    since3.5
    +

    Parameters

    +
    +

    $collection

    +mixed
      +
    • collection as string or object
    • +
    +
    +

    $indexOptions

    +array
      +
    • an associative array of options for the index like array('type' => hash, 'fields' => ..., 'sparse' => false)
    • +

    Exceptions

    @@ -523,19 +584,19 @@

    Returns

    Create a persistent index

    -
    createPersistentIndex(string $collectionId, array $fields, boolean $unique = null, boolean $sparse = null) : array
    +
    createPersistentIndex(mixed $collection, array $fields, boolean $unique = null, boolean $sparse = null, boolean $inBackground = false) : array
    \ArangoDBClient\Exception
    - - + +
    linkhttps://docs.arangodb.com/HTTP/Indexes/Persistent.htmldeprecateduse CollectionHandler::createIndex instead

    Parameters

    -

    $collectionId

    -string
      -
    • the collection id
    • +

      $collection

      +mixed
        +
      • collection as string or object

    $fields

    @@ -552,6 +613,11 @@

    $sparse

    boolean
    • whether the index should be sparse
    +
    +

    $inBackground

    +boolean
      +
    • true if index shall be created in background
    • +

    Exceptions

    @@ -564,19 +630,19 @@

    Returns

    Create a skip-list index

    -
    createSkipListIndex(string $collectionId, array $fields, boolean $unique = null, boolean $sparse = null) : array
    +
    createSkipListIndex(mixed $collection, array $fields, boolean $unique = null, boolean $sparse = null, boolean $inBackground = false) : array
    \ArangoDBClient\Exception
    - - + +
    linkhttps://docs.arangodb.com/HTTP/Indexes/Skiplist.htmldeprecateduse CollectionHandler::createIndex instead

    Parameters

    -

    $collectionId

    -string
      -
    • the collection id
    • +

      $collection

      +mixed
        +
      • collection as string or object

    $fields

    @@ -593,6 +659,52 @@

    $sparse

    boolean
    • whether the index should be sparse
    +
    +

    $inBackground

    +boolean
      +
    • true if index shall be created in background
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\Exception
    +

    Returns

    +
    +array- server response of the created index
    +
    +
    +
    +

    Create a TTL index

    +
    createTtlIndex(mixed $collection, array $fields, \ArangoDBClient\number $expireAfter, boolean $inBackground = false) : array
    +
    +
    +
    + + + +
    deprecateduse CollectionHandler::createIndex instead
    +

    Parameters

    +
    +

    $collection

    +mixed
      +
    • collection as string or object
    • +
    +
    +

    $fields

    +array
      +
    • an array of fields (only a single one allowed)
    • +
    +
    +

    $expireAfter

    +\ArangoDBClient\number
      +
    • number of seconds after index value after which documents expire
    • +
    +
    +

    $inBackground

    +boolean
      +
    • true if index shall be created in background
    • +

    Exceptions

    @@ -632,12 +744,17 @@

    Returns

    Drop an index

    -
    dropIndex(mixed $indexHandle) : boolean
    +
    dropIndex(mixed $collection, mixed $indexHandle = null) : boolean

    Parameters

    +

    $collection

    +mixed
      +
    • collection as string or object
    • +
    +

    $indexHandle

    mixed
    • index handle (collection name / index id)
    • @@ -676,7 +793,7 @@

      Returns

    Get the first document matching a given example.

    -
    firstExample(mixed $collectionId, mixed $document, array $options = array()) : \ArangoDBClient\Document
    +
    firstExample(mixed $collection, mixed $document, array $options = array()) : \ArangoDBClient\Document

    This will throw if the document cannot be fetched from the server

    @@ -686,9 +803,9 @@

    Get the first document matching a given example.

    \ArangoDBClient\Exception

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $document

    @@ -727,6 +844,10 @@

    Get document(s) by a fulltext query

    This will find all documents from the collection that match the fulltext query specified in query. In order to use the fulltext operator, a fulltext index must be defined for the collection and the specified attribute.

    + + + +
    deprecateduse AQL queries instead

    Parameters

    $collection

    @@ -850,16 +971,16 @@

    Returns

    Calculate a checksum of the collection.

    -
    getChecksum(mixed $collectionId, boolean $withRevisions = false, boolean $withData = false) : array
    +
    getChecksum(mixed $collection, boolean $withRevisions = false, boolean $withData = false) : array

    Will calculate a checksum of the meta-data (keys and optionally revision ids) and optionally the document data in the collection.

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as a string or number
    • +
    • collection as string or object

    $withRevisions

    @@ -947,15 +1068,15 @@

    Returns

    Get indexes of a collection

    -
    getIndexes(mixed $collectionId) : array
    +
    getIndexes(mixed $collection) : array

    This will throw if the collection cannot be fetched from the server

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as a string or number
    • +
    • collection as string or object

    Exceptions

    @@ -989,18 +1110,49 @@

    Returns

    \ArangoDBClient\Collection- the collection fetched from the server +
    +

    Get the responsible shard for a document

    +
    getResponsibleShard(mixed $collection, mixed $document) : string
    +
    +
    +
    +
    + + +
    since3.5
    +

    Parameters

    +
    +

    $collection

    +mixed
      +
    • collection as string or object
    • +
    +
    +

    $document

    +mixed
      +
    • document
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\Exception
    +

    Returns

    +
    +string- shard id
    +
    +

    Returns the Collections revision ID

    -
    getRevision(mixed $collectionId) : array
    +
    getRevision(mixed $collection) : array

    The revision id is a server-generated string that clients can use to check whether data in a collection has changed since the last revision check.

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as a string or number
    • +
    • collection as string or object

    Exceptions

    @@ -1012,6 +1164,32 @@

    Returns

    array- containing a key revision +
    +

    Get the shards of a collection

    +
    getShards(mixed $collection) : array
    +
    +
    +
    +
    + + +
    since3.5
    +

    Parameters

    +
    +

    $collection

    +mixed
      +
    • collection as string or object
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\Exception
    +

    Returns

    +
    +array- array with shard ids
    +
    +

    Check if a collection exists

    has(mixed $collection) : boolean
    @@ -1046,7 +1224,7 @@

    Import documents into a collection

    Parameters

    -

    $collection

    mixed $collection - collection id as string or number

    +

    $collection

    mixed $collection - collection as string or object

    $importData

    stringarray
      @@ -1091,16 +1269,12 @@

      Returns

    Import documents from a file

    -
    importFromFile(mixed $collectionId, mixed $importFileName, array $options = array()) : array
    +
    importFromFile($collection, mixed $importFileName, array $options = array()) : array

    This will throw on all errors except insertion errors

    Parameters

    -
    -

    $collectionId

    -mixed
      -
    • collection id as string or number
    • -
    +

    $collection

    $importFileName

    mixed
      @@ -1135,21 +1309,25 @@

      Returns

    Creates an index on a collection on the server

    -
    index(mixed $collectionId, string $type, array $attributes = array(), boolean $unique = false, array $indexOptions = array()) : array
    +
    index(mixed $collection, string $type, array $attributes = array(), boolean $unique = false, array $indexOptions = array()) : array

    This will create an index on the collection on the server and return its id

    This will throw if the index cannot be created

    + + + +
    deprecateduse CollectionHandler::createIndex instead

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • The id of the collection where the index is to be created
    • +
    • collection as string or object

    $type

    string
      -
    • index type: hash, skiplist, geo, fulltext, or persistent
    • +
    • index type: hash, skiplist, geo, ttl, fulltext, or persistent

    $attributes

    @@ -1198,7 +1376,7 @@

    Parameters

    $collection

    mixed
      -
    • collection id as string or number or collection object
    • +
    • collection as string or object

    Exceptions

    @@ -1212,7 +1390,7 @@

    Returns

    Bulk lookup documents by specifying an array of keys

    -
    lookupByKeys(mixed $collectionId, array $keys, array $options = array()) : array
    +
    lookupByKeys(mixed $collection, array $keys, array $options = array()) : array

    This will throw on any error

    @@ -1222,9 +1400,9 @@

    Bulk lookup documents by specifying an array of keys

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $keys

    @@ -1253,15 +1431,19 @@

    Returns

    Get document(s) by specifying near

    -
    near(mixed $collectionId, double $latitude, double $longitude, array $options = array()) : \ArangoDBClient\Cursor
    +
    near(mixed $collection, double $latitude, double $longitude, array $options = array()) : \ArangoDBClient\Cursor

    This will throw if the list cannot be fetched from the server

    + + + +
    deprecateduse AQL queries instead

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $latitude

    @@ -1307,15 +1489,19 @@

    Returns

    Get document(s) by specifying range

    -
    range(mixed $collectionId, string $attribute, mixed $left, mixed $right, array $options = array()) : \ArangoDBClient\Cursor
    +
    range(mixed $collection, string $attribute, mixed $left, mixed $right, array $options = array()) : \ArangoDBClient\Cursor

    This will throw if the list cannot be fetched from the server

    + + + +
    deprecateduse AQL queries instead

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $attribute

    @@ -1366,7 +1552,7 @@

    Returns

    Remove document(s) by specifying an example

    -
    removeByExample(mixed $collectionId, mixed $document, array $options = array()) : integer
    +
    removeByExample(mixed $collection, mixed $document, array $options = array()) : integer

    This will throw on any error

    @@ -1376,9 +1562,9 @@

    Remove document(s) by specifying an example

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $document

    @@ -1409,7 +1595,7 @@

    Returns

    Remove document(s) by specifying an array of keys

    -
    removeByKeys(mixed $collectionId, array $keys, array $options = array()) : array
    +
    removeByKeys(mixed $collection, array $keys, array $options = array()) : array

    This will throw on any error

    @@ -1419,9 +1605,9 @@

    Remove document(s) by specifying an array of keys

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $keys

    @@ -1459,7 +1645,7 @@

    Parameters

    $collection

    mixed
      -
    • collection id as string or number or collection object
    • +
    • collection as string or object

    $name

    @@ -1478,20 +1664,26 @@

    Returns

    Replace document(s) matching a given example

    -
    replaceByExample(mixed $collectionId, mixed $example, mixed $newValue, mixed $options = array()) : boolean
    +
    replaceByExample(mixed $collection, mixed $example, mixed $newValue, mixed $options = array()) : boolean

    This will replace the document(s) on the server

    This will throw if the document cannot be replaced

    - +
    + + + + + -
    deprecateduse AQL queries instead
    since 1.2
    + +

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $example

    @@ -1583,7 +1775,7 @@

    Parameters

    $collection

    mixed
      -
    • collection id as string or number or collection object
    • +
    • collection as string or object

    Exceptions

    @@ -1597,20 +1789,26 @@

    Returns

    Update document(s) matching a given example

    -
    updateByExample(mixed $collectionId, mixed $example, mixed $newValue, mixed $options = array()) : boolean
    +
    updateByExample(mixed $collection, mixed $example, mixed $newValue, mixed $options = array()) : boolean

    This will update the document(s) on the server

    This will throw if the document cannot be updated

    -
    +
    + + + + + -
    deprecateduse AQL queries instead
    since 1.2
    + +

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or number

    $example

    @@ -1644,15 +1842,19 @@

    Returns

    Get document(s) by specifying within

    -
    within(mixed $collectionId, double $latitude, double $longitude, integer $radius, array $options = array()) : \ArangoDBClient\Cursor
    +
    within(mixed $collection, double $latitude, double $longitude, integer $radius, array $options = array()) : \ArangoDBClient\Cursor

    This will throw if the list cannot be fetched from the server

    + + + +
    deprecateduse AQL queries instead

    Parameters

    -

    $collectionId

    +

    $collection

    mixed
      -
    • collection id as string or number
    • +
    • collection as string or object

    $latitude

    @@ -1701,6 +1903,25 @@

    Returns

    \ArangoDBClient\Cursor- documents matching the example [0...n]
    +
    +

    Add a transaction header to the array of headers in case this is a transactional operation

    +
    addTransactionHeader(array $headers, mixed $collection) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $headers

    +array
      +
    • already existing headers
    • +
    +
    +

    $collection

    +mixed
      +
    • any type of collection (can be StreamingTransactionCollection or other)
    • +
    +
    +

    Return the connection object

    getConnection() : \ArangoDBClient\Connection
    @@ -1806,10 +2027,10 @@

    Returns

    string- collection name
    -
    -

    createCollectionIfOptions() +
    +

    lazyCreateCollection()

    -
    createCollectionIfOptions($collection, $options) 
    +
    lazyCreateCollection($collection, $options) 
    @@ -1918,6 +2139,12 @@

    exclude system collections

    + 
    +

    expireAfter option

    +
    OPTION_EXPIRE_AFTER = 'expireAfter' 
    +
    +
    +
     

    fields

    OPTION_FIELDS = 'fields' 
    @@ -1960,6 +2187,12 @@

    index parameter

    + 
    +

    inBackground option

    +
    OPTION_IN_BACKGROUND = 'inBackground' 
    +
    +
    +
     

    keys parameter

    OPTION_KEYS = 'keys' 
    @@ -2038,6 +2271,12 @@

    rename option

    + 
    +

    responsible shard option

    +
    OPTION_RESPONSIBLE_SHARD = 'responsibleShard' 
    +
    +
    +
     

    revision option

    OPTION_REVISION = 'revision' 
    @@ -2050,6 +2289,12 @@

    right parameter

    + 
    +

    shards option

    +
    OPTION_SHARDS = 'shards' 
    +
    +
    +
     

    size option

    OPTION_SIZE = 'size' 
    @@ -2074,12 +2319,24 @@

    sparse index option

    + 
    +

    stream parameter

    +
    OPTION_STREAM = 'stream' 
    +
    +
    +
     

    truncate option

    OPTION_TRUNCATE = 'truncate' 
    + 
    +

    ttl index option

    +
    OPTION_TTL_INDEX = 'ttl' 
    +
    +
    +
     

    type

    OPTION_TYPE = 'type' 
    @@ -2105,7 +2362,7 @@

    unload option

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.ConnectException.html b/docs/classes/ArangoDBClient.ConnectException.html index d29e4b66..36085006 100644 --- a/docs/classes/ArangoDBClient.ConnectException.html +++ b/docs/classes/ArangoDBClient.ConnectException.html @@ -31,11 +31,11 @@ Reports
    @@ -175,7 +175,7 @@

    Default

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.Connection.html b/docs/classes/ArangoDBClient.Connection.html index a7d0d679..64d7bb6c 100644 --- a/docs/classes/ArangoDBClient.Connection.html +++ b/docs/classes/ArangoDBClient.Connection.html @@ -31,11 +31,11 @@ Reports
    @@ -882,7 +882,7 @@

    Default

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.ConnectionOptions.html b/docs/classes/ArangoDBClient.ConnectionOptions.html index 4f4b001a..0f6e77c7 100644 --- a/docs/classes/ArangoDBClient.ConnectionOptions.html +++ b/docs/classes/ArangoDBClient.ConnectionOptions.html @@ -31,11 +31,11 @@ Reports
    @@ -120,6 +120,7 @@
  • Batch flag
    OPTION_BATCH
  • Batchpart flag
    OPTION_BATCHPART
  • Batch size index constant
    OPTION_BATCHSIZE
  • +
  • "caFile" index constant
    OPTION_CA_FILE
  • UTF-8 CHeck Flag
    OPTION_CHECK_UTF8_CONFORM
  • ciphers allowed to be used in SSL
    OPTION_CIPHERS
  • Connection
    OPTION_CONNECTION
  • @@ -500,6 +501,12 @@

    Batch size index constant

    + 
    +

    "caFile" index constant

    +
    OPTION_CA_FILE = 'caFile' 
    +
    +
    +
     

    UTF-8 CHeck Flag

    OPTION_CHECK_UTF8_CONFORM = 'CheckUtf8Conform' 
    @@ -706,7 +713,7 @@

    Wait for sync index constant

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.Cursor.html b/docs/classes/ArangoDBClient.Cursor.html index b11c659f..59bfbfb8 100644 --- a/docs/classes/ArangoDBClient.Cursor.html +++ b/docs/classes/ArangoDBClient.Cursor.html @@ -31,11 +31,11 @@ Reports
    @@ -950,7 +950,7 @@

    result entry for the full count (ignoring the outermost LIMIT)

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.Database.html b/docs/classes/ArangoDBClient.Database.html index 2b092660..4ff338f7 100644 --- a/docs/classes/ArangoDBClient.Database.html +++ b/docs/classes/ArangoDBClient.Database.html @@ -31,11 +31,11 @@ Reports
    @@ -332,7 +332,7 @@

    Users index

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.DefaultValues.html b/docs/classes/ArangoDBClient.DefaultValues.html index 5e75c98b..42003dd9 100644 --- a/docs/classes/ArangoDBClient.DefaultValues.html +++ b/docs/classes/ArangoDBClient.DefaultValues.html @@ -31,11 +31,11 @@ Reports
    @@ -225,7 +225,7 @@

    Default value for waitForSync (fsync all data to disk on document updates/in
    + generated on 2019-08-19T13:30:48+02:00.

    diff --git a/docs/classes/ArangoDBClient.Document.html b/docs/classes/ArangoDBClient.Document.html index 5d866b35..bb9d6a8a 100644 --- a/docs/classes/ArangoDBClient.Document.html +++ b/docs/classes/ArangoDBClient.Document.html @@ -31,11 +31,11 @@ Reports
    @@ -131,6 +131,7 @@
  • isNew id index
    ENTRY_ISNEW
  • Document key index
    ENTRY_KEY
  • Revision id index
    ENTRY_REV
  • +
  • regular expression used for key validation
    KEY_REGEX_PART
  • keepNull option index
    OPTION_KEEPNULL
  • policy option index
    OPTION_POLICY
  • waitForSync option index
    OPTION_WAIT_FOR_SYNC
  • @@ -873,6 +874,12 @@

    Revision id index

    + 
    +

    regular expression used for key validation

    +
    KEY_REGEX_PART = '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' 
    +
    +
    +
     

    keepNull option index

    OPTION_KEEPNULL = 'keepNull' 
    @@ -898,7 +905,7 @@

    waitForSync option index

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.DocumentClassable.html b/docs/classes/ArangoDBClient.DocumentClassable.html index 70eed001..7cdddc78 100644 --- a/docs/classes/ArangoDBClient.DocumentClassable.html +++ b/docs/classes/ArangoDBClient.DocumentClassable.html @@ -31,11 +31,11 @@ Reports
    @@ -160,7 +160,7 @@

    Default

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.DocumentHandler.html b/docs/classes/ArangoDBClient.DocumentHandler.html index c495110c..e3c28802 100644 --- a/docs/classes/ArangoDBClient.DocumentHandler.html +++ b/docs/classes/ArangoDBClient.DocumentHandler.html @@ -31,11 +31,11 @@ Reports
    @@ -66,12 +66,12 @@
  • Get a single document from a collection
    getById()
  • Gets information about a single documents from a collection
    getHead()
  • Check if a document exists
    has()
  • -
  • Insert a document into a collection
    insert()
  • +
  • insert a document into a collection
    insert()
  • Remove a document from a collection, identified by the document itself
    remove()
  • Remove a document from a collection, identified by the collection id and document id
    removeById()
  • Replace an existing document in a collection, identified by the document itself
    replace()
  • Replace an existing document in a collection, identified by collection id and document id
    replaceById()
  • -
  • save a document to a collection
    save()
  • +
  • Insert a document into a collection
    save()
  • Sets the document class to use
    setDocumentClass()
  • Sets the edge class to use
    setEdgeClass()
  • Store a document to a collection
    store()
  • @@ -83,8 +83,7 @@ @@ -315,15 +316,47 @@

    Returns

    -

    Insert a document into a collection

    -
    insert($collection, $document, array $options = array()
    +

    insert a document into a collection

    +
    insert(mixed $collection, \ArangoDBClient\Document|array $document, array $options = array()) : mixed
    -

    This is an alias for save().

    +

    This will add the document to the collection and return the document's id

    +

    This will throw if the document cannot be saved

    + + + +
    since1.0

    Parameters

    -

    $collection

    -

    $document

    -

    $options

    +
    +

    $collection

    +mixed
      +
    • collection id as string or number
    • +
    +
    +

    $document

    +\ArangoDBClient\Documentarray
      +
    • the document to be added, can be passed as a document or an array
    • +
    +
    +

    $options

    +array
      +
    • optional, array of options +

      Options are :
      +

    • 'createCollection' - create the collection if it does not yet exist.
    • +
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • +
    • 'overwrite' - if set to true, will turn the insert into a replace operation if a document with the specified key already exists.
    • +
    • 'returnNew' - if set to true, then the newly created document will be returned.
    • +
    • 'returnOld' - if set to true, then the replaced document will be returned - useful only when using overwrite = true.
    • +

      +
    +

    Exceptions

    + + + +
    \ArangoDBClient\Exception
    +

    Returns

    +
    +mixed- id of document created
    @@ -403,8 +436,8 @@

    Replace an existing document in a collection, identified by the document its
    replace(\ArangoDBClient\Document $document, array $options = array()) : boolean
    -

    This will update the document on the server

    -

    This will throw if the document cannot be updated

    +

    This will replace the document on the server

    +

    This will throw if the document cannot be replaced

    If policy is set to error (locally or globally through the ConnectionOptions) and the passed document has a _rev value set, the database will check that the revision of the to-be-replaced document is the same as the one given.

    @@ -412,14 +445,14 @@

    Parameters

    $document

    \ArangoDBClient\Document
      -
    • document to be updated
    • +
    • document to be replaced

    $options

    array
    • optional, array of options

      Options are : -

    • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
    • +
    • 'policy' - replace policy to be used in case of conflict ('error', 'last' or NULL [use default])
    • 'waitForSync' - can be used to force synchronisation of the document update operation to disk even in case that the waitForSync flag had been disabled for the entire collection
    @@ -479,47 +512,15 @@

    Returns

    -

    save a document to a collection

    -
    save(mixed $collection, \ArangoDBClient\Document|array $document, array $options = array()) : mixed
    +

    Insert a document into a collection

    +
    save($collection, $document, array $options = array()
    -

    This will add the document to the collection and return the document's id

    -

    This will throw if the document cannot be saved

    - - - -
    since1.0
    +

    This is an alias for insert().

    Parameters

    -
    -

    $collection

    -mixed
      -
    • collection id as string or number
    • -
    -
    -

    $document

    -\ArangoDBClient\Documentarray
      -
    • the document to be added, can be passed as a document or an array
    • -
    -
    -

    $options

    -array
      -
    • optional, array of options -

      Options are :
      -

    • 'createCollection' - create the collection if it does not yet exist.
    • -
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • -
    • 'overwrite' - if set to true, will turn the insert into a replace operation if a document with the specified key already exists.
    • -
    • 'returnNew' - if set to true, then the newly created document will be returned.
    • -
    • 'returnOld' - if set to true, then the replaced document will be returned - useful only when using overwrite = true.
    • -

      -
    -

    Exceptions

    - - - -
    \ArangoDBClient\Exception
    -

    Returns

    -
    -mixed- id of document created
    +

    $collection

    +

    $document

    +

    $options

    @@ -676,25 +677,22 @@

    Returns

    boolean- always true, will throw if there is an error

    -
    -

    createCollectionIfOptions() -

    -
    createCollectionIfOptions($collection, array $options) 
    -
    +
    +

    Add a transaction header to the array of headers in case this is a transactional operation

    +
    addTransactionHeader(array $headers, mixed $collection) 
    +
    Inherited

    Parameters

    -

    $collection

    mixed collection name or id

    -
    -

    $options

    +

    $headers

    array
      -
    • optional, array of options -

      Options are : -

    • 'createCollection' - true to create the collection if it does not exist
    • -
    • 'createCollectionType' - "document" or 2 for document collection
    • -
    • "edge" or 3 for edge collection
    • -

      +
    • already existing headers
    • +
    +
    +

    $collection

    +mixed
      +
    • any type of collection (can be StreamingTransactionCollection or other)
    @@ -799,6 +797,29 @@

    Returns

    string- json string of the body that was passed
    +
    +

    lazyCreateCollection() +

    +
    lazyCreateCollection(mixed $collection, array $options) 
    +
    +
    +
    +

    Parameters

    +
    +

    $collection

    +mixed

    collection name or id

    +
    +

    $options

    +array
      +
    • optional, array of options +

      Options are : +

    • 'createCollectionType' - "document" or 2 for document collection
    • +
    • "edge" or 3 for edge collection
    • +
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • +

      +
    +
    +

    Turn a value into a collection name

    makeCollection(mixed $value) : string
    @@ -948,7 +969,7 @@

    option for returning the old document

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.Edge.html b/docs/classes/ArangoDBClient.Edge.html index 8364d9aa..2c481437 100644 --- a/docs/classes/ArangoDBClient.Edge.html +++ b/docs/classes/ArangoDBClient.Edge.html @@ -31,11 +31,11 @@ Reports
    @@ -141,6 +141,7 @@
  • Document key index
    ENTRY_KEY
  • Revision id index
    ENTRY_REV
  • Revision _to index
    ENTRY_TO
  • +
  • regular expression used for key validation
    KEY_REGEX_PART
  • keepNull option index
    OPTION_KEEPNULL
  • policy option index
    OPTION_POLICY
  • waitForSync option index
    OPTION_WAIT_FOR_SYNC
  • @@ -1022,6 +1023,12 @@

    Revision _to index

    + 
    +

    regular expression used for key validation

    +
    KEY_REGEX_PART = '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' 
    +
    +
    +
     

    keepNull option index

    OPTION_KEEPNULL = 'keepNull' 
    @@ -1047,7 +1054,7 @@

    waitForSync option index

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.EdgeDefinition.html b/docs/classes/ArangoDBClient.EdgeDefinition.html index 8f1cfc84..7db695cf 100644 --- a/docs/classes/ArangoDBClient.EdgeDefinition.html +++ b/docs/classes/ArangoDBClient.EdgeDefinition.html @@ -31,11 +31,11 @@ Reports @@ -378,7 +378,7 @@

    Default

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.EdgeHandler.html b/docs/classes/ArangoDBClient.EdgeHandler.html index 58d8a9ab..0939493f 100644 --- a/docs/classes/ArangoDBClient.EdgeHandler.html +++ b/docs/classes/ArangoDBClient.EdgeHandler.html @@ -31,11 +31,11 @@ Reports @@ -70,13 +70,13 @@
  • Gets information about a single documents from a collection
    getHead()
  • Check if a document exists
    has()
  • Get connected inbound edges for a given vertex
    inEdges()
  • -
  • Insert a document into a collection
    insert()
  • +
  • insert a document into a collection
    insert()
  • Get connected outbound edges for a given vertex
    outEdges()
  • Remove a document from a collection, identified by the document itself
    remove()
  • Remove a document from a collection, identified by the collection id and document id
    removeById()
  • Replace an existing document in a collection, identified by the document itself
    replace()
  • Replace an existing document in a collection, identified by collection id and document id
    replaceById()
  • -
  • save a document to a collection
    save()
  • +
  • Insert a document into a collection
    save()
  • save an edge to an edge-collection
    saveEdge()
  • Sets the document class to use
    setDocumentClass()
  • Sets the edge class to use
    setEdgeClass()
  • @@ -89,10 +89,7 @@ @@ -438,15 +439,47 @@

    Returns

    -

    Insert a document into a collection

    -
    insert($collection, $document, array $options = array()
    +

    insert a document into a collection

    +
    insert(mixed $collection, \ArangoDBClient\Document|array $document, array $options = array()) : mixed
    Inherited
    -

    This is an alias for save().

    +

    This will add the document to the collection and return the document's id

    +

    This will throw if the document cannot be saved

    + + + +
    since1.0

    Parameters

    -

    $collection

    -

    $document

    -

    $options

    +
    +

    $collection

    +mixed
      +
    • collection id as string or number
    • +
    +
    +

    $document

    +\ArangoDBClient\Documentarray
      +
    • the document to be added, can be passed as a document or an array
    • +
    +
    +

    $options

    +array
      +
    • optional, array of options +

      Options are :
      +

    • 'createCollection' - create the collection if it does not yet exist.
    • +
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • +
    • 'overwrite' - if set to true, will turn the insert into a replace operation if a document with the specified key already exists.
    • +
    • 'returnNew' - if set to true, then the newly created document will be returned.
    • +
    • 'returnOld' - if set to true, then the replaced document will be returned - useful only when using overwrite = true.
    • +

      +
    +

    Exceptions

    + + + +
    \ArangoDBClient\Exception
    +

    Returns

    +
    +mixed- id of document created
    @@ -553,8 +586,8 @@

    Replace an existing document in a collection, identified by the document its
    replace(\ArangoDBClient\Document $document, array $options = array()) : boolean
    Inherited
    -

    This will update the document on the server

    -

    This will throw if the document cannot be updated

    +

    This will replace the document on the server

    +

    This will throw if the document cannot be replaced

    If policy is set to error (locally or globally through the ConnectionOptions) and the passed document has a _rev value set, the database will check that the revision of the to-be-replaced document is the same as the one given.

    @@ -562,14 +595,14 @@

    Parameters

    $document

    \ArangoDBClient\Document
      -
    • document to be updated
    • +
    • document to be replaced

    $options

    array
    • optional, array of options

      Options are : -

    • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
    • +
    • 'policy' - replace policy to be used in case of conflict ('error', 'last' or NULL [use default])
    • 'waitForSync' - can be used to force synchronisation of the document update operation to disk even in case that the waitForSync flag had been disabled for the entire collection
    @@ -629,47 +662,15 @@

    Returns

    -

    save a document to a collection

    -
    save(mixed $collection, \ArangoDBClient\Document|array $document, array $options = array()) : mixed
    +

    Insert a document into a collection

    +
    save($collection, $document, array $options = array()
    Inherited
    -

    This will add the document to the collection and return the document's id

    -

    This will throw if the document cannot be saved

    - - - -
    since1.0
    +

    This is an alias for insert().

    Parameters

    -
    -

    $collection

    -mixed
      -
    • collection id as string or number
    • -
    -
    -

    $document

    -\ArangoDBClient\Documentarray
      -
    • the document to be added, can be passed as a document or an array
    • -
    -
    -

    $options

    -array
      -
    • optional, array of options -

      Options are :
      -

    • 'createCollection' - create the collection if it does not yet exist.
    • -
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • -
    • 'overwrite' - if set to true, will turn the insert into a replace operation if a document with the specified key already exists.
    • -
    • 'returnNew' - if set to true, then the newly created document will be returned.
    • -
    • 'returnOld' - if set to true, then the replaced document will be returned - useful only when using overwrite = true.
    • -

      -
    -

    Exceptions

    - - - -
    \ArangoDBClient\Exception
    -

    Returns

    -
    -mixed- id of document created
    +

    $collection

    +

    $document

    +

    $options

    @@ -878,51 +879,22 @@

    Returns

    boolean- always true, will throw if there is an error

    -
    -

    createCollectionIfOptions() -

    -
    createCollectionIfOptions($collection, array $options) 
    -
    +
    +

    Add a transaction header to the array of headers in case this is a transactional operation

    +
    addTransactionHeader(array $headers, mixed $collection) 
    +
    Inherited
    - - - -
    inherited_from\ArangoDBClient\DocumentHandler::createCollectionIfOptions()

    Parameters

    -

    $collection

    mixed collection name or id

    -
    -

    $options

    +

    $headers

    array
      -
    • optional, array of options -

      Options are : -

    • 'createCollection' - true to create the collection if it does not exist
    • -
    • 'createCollectionType' - "document" or 2 for document collection
    • -
    • "edge" or 3 for edge collection
    • -

      +
    • already existing headers
    -
    -
    -
    -

    createCollectionIfOptions() -

    -
    createCollectionIfOptions($collection, array $options) 
    -
    Inherited
    -
    -
    -

    Parameters

    -

    $collection

    mixed collection name or id

    -
    -

    $options

    -array
      -
    • optional, array of options -

      Options are : -

    • 'createCollection' - true to create the collection if it does not exist
    • -
    • 'createCollectionType' - "document" or 2 for document collection
    • -
    • "edge" or 3 for edge collection
    • -

      +

      $collection

      +mixed
        +
      • any type of collection (can be StreamingTransactionCollection or other)
    @@ -1027,6 +999,55 @@

    Returns

    string- json string of the body that was passed
    +
    +

    lazyCreateCollection() +

    +
    lazyCreateCollection(mixed $collection, array $options) 
    +
    +
    +
    + + + +
    inherited_from\ArangoDBClient\DocumentHandler::lazyCreateCollection()
    +

    Parameters

    +
    +

    $collection

    mixed collection name or id

    +
    +

    $options

    +array
      +
    • optional, array of options +

      Options are : +

    • 'createCollection' - true to create the collection if it does not exist
    • +
    • 'createCollectionType' - "document" or 2 for document collection
    • +
    • "edge" or 3 for edge collection
    • +

      +
    +
    +
    +
    +

    lazyCreateCollection() +

    +
    lazyCreateCollection(mixed $collection, array $options) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $collection

    +mixed

    collection name or id

    +
    +

    $options

    +array
      +
    • optional, array of options +

      Options are : +

    • 'createCollectionType' - "document" or 2 for document collection
    • +
    • "edge" or 3 for edge collection
    • +
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • +

      +
    +
    +

    Turn a value into a collection name

    makeCollection(mixed $value) : string
    @@ -1242,7 +1263,7 @@

    vertex parameter

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.Endpoint.html b/docs/classes/ArangoDBClient.Endpoint.html index ed225fb1..bc9c5fe1 100644 --- a/docs/classes/ArangoDBClient.Endpoint.html +++ b/docs/classes/ArangoDBClient.Endpoint.html @@ -31,11 +31,11 @@ Reports @@ -340,7 +340,7 @@

    UNIX socket endpoint type

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.Exception.html b/docs/classes/ArangoDBClient.Exception.html index 30c3c1b4..89e41224 100644 --- a/docs/classes/ArangoDBClient.Exception.html +++ b/docs/classes/ArangoDBClient.Exception.html @@ -31,11 +31,11 @@ Reports @@ -153,7 +153,7 @@

    Default

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.Export.html b/docs/classes/ArangoDBClient.Export.html index d023e893..075bac23 100644 --- a/docs/classes/ArangoDBClient.Export.html +++ b/docs/classes/ArangoDBClient.Export.html @@ -31,11 +31,11 @@ Reports @@ -414,7 +414,7 @@

    Export restrictions

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.ExportCursor.html b/docs/classes/ArangoDBClient.ExportCursor.html index 811001b5..a4877f1f 100644 --- a/docs/classes/ArangoDBClient.ExportCursor.html +++ b/docs/classes/ArangoDBClient.ExportCursor.html @@ -31,11 +31,11 @@ Reports @@ -438,7 +438,7 @@

    "type" option entry (is used when converting the result into documents or ed
    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.FailoverException.html b/docs/classes/ArangoDBClient.FailoverException.html index 5123febb..6e38ed95 100644 --- a/docs/classes/ArangoDBClient.FailoverException.html +++ b/docs/classes/ArangoDBClient.FailoverException.html @@ -31,11 +31,11 @@ Reports @@ -219,7 +219,7 @@

    Default

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.FoxxHandler.html b/docs/classes/ArangoDBClient.FoxxHandler.html index 4d6e1754..88279972 100644 --- a/docs/classes/ArangoDBClient.FoxxHandler.html +++ b/docs/classes/ArangoDBClient.FoxxHandler.html @@ -31,11 +31,11 @@ Reports @@ -70,6 +70,7 @@
  • Graph orphan collections
    ENTRY_ORPHAN_COLLECTIONS
  • Revision id index
    ENTRY_REV
  • Graph edge definitions to collections
    ENTRY_TO
  • +
  • regular expression used for key validation
    KEY_REGEX_PART
  • keepNull option index
    OPTION_KEEPNULL
  • policy option index
    OPTION_POLICY
  • waitForSync option index
    OPTION_WAIT_FOR_SYNC
  • @@ -1092,6 +1093,12 @@

    Graph edge definitions to collections

    + 
    +

    regular expression used for key validation

    +
    KEY_REGEX_PART = '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' 
    +
    +
    +
     

    keepNull option index

    OPTION_KEEPNULL = 'keepNull' 
    @@ -1117,7 +1124,7 @@

    waitForSync option index

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.GraphHandler.html b/docs/classes/ArangoDBClient.GraphHandler.html index c388cc7f..a0540577 100644 --- a/docs/classes/ArangoDBClient.GraphHandler.html +++ b/docs/classes/ArangoDBClient.GraphHandler.html @@ -31,11 +31,11 @@ Reports @@ -98,6 +98,7 @@ @@ -374,7 +374,7 @@

    HTTP location header

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.QueryCacheHandler.html b/docs/classes/ArangoDBClient.QueryCacheHandler.html index 6e413a01..7e99964b 100644 --- a/docs/classes/ArangoDBClient.QueryCacheHandler.html +++ b/docs/classes/ArangoDBClient.QueryCacheHandler.html @@ -31,11 +31,11 @@ Reports @@ -75,6 +75,7 @@ @@ -128,6 +128,7 @@
  • $_stream
  • +
  • $_trxId
  • $_ttl
  • @@ -145,6 +146,7 @@
  • Query string index
    ENTRY_QUERY
  • Retries index
    ENTRY_RETRIES
  • Stream attribute
    ENTRY_STREAM
  • +
  • transaction attribute (used internally)
    ENTRY_TRANSACTION
  • TTL attribute
    ENTRY_TTL
  • Full count option index
    FULL_COUNT
  • @@ -798,6 +800,16 @@

    Default

    + 
    +

    transaction id (used internally)

    +
    $_trxId : string
    +
    +

    Default

    +
    null
    +
    +
    +
    +
     

    Number of seconds the cursor will be kept on the server if the statement result is bigger than the initial batch size. The default value is a server-defined @@ -870,6 +882,12 @@

    Stream attribute

    + 
    +

    transaction attribute (used internally)

    +
    ENTRY_TRANSACTION = 'transaction' 
    +
    +
    +
     

    TTL attribute

    ENTRY_TTL = 'ttl' 
    @@ -889,7 +907,7 @@

    Full count option index

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.StreamingTransaction.html b/docs/classes/ArangoDBClient.StreamingTransaction.html new file mode 100644 index 00000000..13c391af --- /dev/null +++ b/docs/classes/ArangoDBClient.StreamingTransaction.html @@ -0,0 +1,679 @@ + + + + + +ArangoDB PHP client API » \ArangoDBClient\StreamingTransaction + + + + + + + + + + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +

    Streaming transaction object

    +
    +
    + + + + + + + + + + + + + +
    packageArangoDBClient
    since3.5
    inherited_from\ArangoDBClient\TransactionBase
    +

    + Methods

    +
    +

    Constructs a streaming transaction object

    +
    __construct(\ArangoDBClient\Connection $connection, array $transactionArray = null
    +
    +
    +
    + + + +
    inherited_from\ArangoDBClient\TransactionBase::__construct()
    +

    Parameters

    +
    +

    $connection

    +\ArangoDBClient\Connection
      +
    • client connection
    • +
    +
    +

    $transactionArray

    +array
      +
    • array with collections used by the transaction
    • +
    +
    +
    +
    +

    Initialise the transaction object

    +
    __construct(\ArangoDBClient\Connection $connection) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $connection

    +\ArangoDBClient\Connection
      +
    • the connection to be used
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Get an attribute, magic method

    +
    __get(string $key) : mixed
    +
    Inherited
    +
    +

    This function is mapped to get() internally.

    + + + +
    magic
    +

    Parameters

    +
    +

    $key

    +string
      +
    • name of attribute
    • +
    +

    Returns

    +
    +mixed- value of attribute, NULL if attribute is not set
    +
    +
    +
    +

    Is triggered by calling isset() or empty() on inaccessible properties.

    +
    __isset(string $key) : boolean
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $key

    +string
      +
    • name of attribute
    • +
    +

    Returns

    +
    +booleanreturns true or false (set or not set)
    +
    +
    +
    +

    Set an attribute, magic method

    +
    __set(string $key, mixed $value) : void
    +
    Inherited
    +
    +

    This is a magic method that allows the object to be used without +declaring all document attributes first.

    + + + +
    magic
    +

    Parameters

    +
    +

    $key

    +string
      +
    • attribute name
    • +
    +
    +

    $value

    +mixed
      +
    • value for attribute
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Get an attribute

    +
    get(string $key) : mixed
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $key

    +string
      +
    • name of attribute
    • +
    +

    Returns

    +
    +mixed- value of attribute, NULL if attribute is not set
    +
    +
    +
    +

    Get a participating collection of the transaction by name +Will throw an exception if the collection is not part of the transaction

    +
    getCollection(string $name) : \ArangoDBClient\StreamingTransactionCollection
    +
    +
    +
    +

    Parameters

    +
    +

    $name

    +string
      +
    • name of the collection
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +

    Returns

    +
    +\ArangoDBClient\StreamingTransactionCollection- collection object
    +
    +
    +
    +

    Get collections array

    +
    getCollections() : array
    +
    Inherited
    +
    +

    This holds the read and write collections of the transaction

    +

    Returns

    +
    +array$value
    +
    +
    +
    +

    Convenience function to directly get exclusive-collections without having to access +them from the collections attribute.

    +
    getExclusiveCollections() : array
    +
    Inherited
    +
    +
    +

    Returns

    +
    +arrayparams
    +
    +
    +
    +

    Get the transaction's id

    +
    getId() : string
    +
    +
    +
    +

    Returns

    +
    +string- transaction id
    +
    +
    +
    +

    Get lockTimeout value

    +
    getLockTimeout() : integer
    +
    Inherited
    +
    +
    +

    Returns

    +
    +integerlockTimeout
    +
    +
    +
    +

    Convenience function to directly get read-collections without having to access +them from the collections attribute.

    +
    getReadCollections() : array
    +
    Inherited
    +
    +
    +

    Returns

    +
    +arrayparams
    +
    +
    +
    +

    get waitForSync value

    +
    getWaitForSync() : boolean
    +
    Inherited
    +
    +
    +

    Returns

    +
    +booleanwaitForSync
    +
    +
    +
    +

    Convenience function to directly get write-collections without having to access +them from the collections attribute.

    +
    getWriteCollections() : array
    +
    Inherited
    +
    +
    +

    Returns

    +
    +arrayparams
    +
    +
    +
    +

    Executes an AQL query inside the transaction

    +
    query(array $data) : \ArangoDBClient\Cursor
    +
    +
    +

    This is a shortcut for creating a new Statement and executing it.

    +

    Parameters

    +
    +

    $data

    +array
      +
    • query data, as is required by Statement::__construct()
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +

    Returns

    +
    +\ArangoDBClient\Cursor- query cursor, as returned by Statement::execute()
    +
    +
    +
    +

    Sets an attribute

    +
    set($key, $value) 
    +
    Inherited
    +
    +
    +

    Parameters

    +

    $key

    +

    $value

    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Set the collections array.

    +
    setCollections(array $value) 
    +
    Inherited
    +
    +

    The array should have 2 sub-arrays, namely 'read' and 'write' which should hold the respective collections +for the transaction

    +

    Parameters

    +
    +

    $value

    +array +
    +
    +
    +
    +

    Convenience function to directly set exclusive-collections without having to access +them from the collections attribute.

    +
    setExclusiveCollections(array $value) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +array +
    +
    +
    +
    +

    Set the transaction's id - this is used internally and should not be called by end users

    +
    setId(mixed $id) 
    +
    +
    +
    +

    Parameters

    +
    +

    $id

    +mixed
      +
    • transaction id as number or string
    • +
    +
    +
    +
    +

    Set lockTimeout value

    +
    setLockTimeout(integer $value) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +integer +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Convenience function to directly set read-collections without having to access +them from the collections attribute.

    +
    setReadCollections(array $value) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +array +
    +
    +
    +
    +

    set waitForSync value

    +
    setWaitForSync(boolean $value) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +boolean +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Convenience function to directly set write-collections without having to access +them from the collections attribute.

    +
    setWriteCollections(array $value) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +array +
    +
    +
    +
    +

    Build the object's attributes from a given array

    +
    buildTransactionAttributesFromArray($options) 
    +
    +
    +
    + + + +
    inherited_from\ArangoDBClient\TransactionBase::buildTransactionAttributesFromArray()
    +

    Parameters

    +

    $options

    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Build the object's attributes from a given array

    +
    buildTransactionAttributesFromArray($options) 
    +
    Inherited
    +
    +
    +

    Parameters

    +

    $options

    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Return the connection object

    +
    getConnection() : \ArangoDBClient\Connection
    +
    Inherited
    +
    +
    +

    Returns

    +
    +\ArangoDBClient\Connection- the connection object
    +
    +
    +

    + Properties

    + 
    +

    The transaction's attributes.

    +
    $attributes : array
    +
    +

    Default

    +
    array()
    +
    +
    +
    +
    + 
    +

    An array of collections used by this transaction

    +
    $_collections : array
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The connection object

    +
    $_connection : \ArangoDBClient\Connection
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The transaction id - assigned by the server

    +
    $_id : string
    +
    +

    Default

    +
    +
    +
    +
    +
    +

    + Constants

    + 
    +

    Collections index

    +
    ENTRY_COLLECTIONS = 'collections' 
    +
    +
    +
    + 
    +

    EXCLUSIVE index

    +
    ENTRY_EXCLUSIVE = 'exclusive' 
    +
    +
    +
    + 
    +

    class constant for id values

    +
    ENTRY_ID = 'id' 
    +
    +
    +
    + 
    +

    Lock timeout index

    +
    ENTRY_LOCK_TIMEOUT = 'lockTimeout' 
    +
    +
    +
    + 
    +

    Read index

    +
    ENTRY_READ = 'read' 
    +
    +
    +
    + 
    +

    WaitForSync index

    +
    ENTRY_WAIT_FOR_SYNC = 'waitForSync' 
    +
    +
    +
    + 
    +

    WRITE index

    +
    ENTRY_WRITE = 'write' 
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/classes/ArangoDBClient.StreamingTransactionCollection.html b/docs/classes/ArangoDBClient.StreamingTransactionCollection.html new file mode 100644 index 00000000..12484b42 --- /dev/null +++ b/docs/classes/ArangoDBClient.StreamingTransactionCollection.html @@ -0,0 +1,1211 @@ + + + + + +ArangoDB PHP client API » \ArangoDBClient\StreamingTransactionCollection + + + + + + + + + + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +

    Streaming transaction collection object

    +
    +


    + + + + + + + + + + + + + +
    packageArangoDBClient
    since3.5
    inherited_from\ArangoDBClient\Collection
    +

    + Methods

    +
    +

    Clone a collection

    +
    __clone() : void
    +
    Inherited
    +
    +

    Returns the clone

    + + + +
    magic
    +
    +
    +
    +

    Constructs a streaming transaction collection object

    +
    __construct(\ArangoDBClient\StreamingTransaction $trx, string $name, string $mode) 
    +
    +
    +
    + + + +
    inherited_from\ArangoDBClient\Collection::__construct()
    +

    Parameters

    +
    +

    $trx

    +\ArangoDBClient\StreamingTransaction
      +
    • the transaction
    • +
    +
    +

    $name

    +string
      +
    • collection name
    • +
    +
    +

    $mode

    +string
      +
    • lock mode, i.e. 'read', 'write', 'exclusive'
    • +
    +
    +
    +
    +

    Constructs an empty collection

    +
    __construct(string $name = null
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $name

    +string
      +
    • name for the collection
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Return the name of the collection

    +
    __toString() : string
    +
    +
    +

    Returns the collection as JSON-encoded string

    + + + + + + + + + +
    magic
    inherited_from\ArangoDBClient\Collection::__toString()
    +

    Returns

    +
    +string- collection name
    +
    +
    +
    +

    Get a string representation of the collection

    +
    __toString() : string
    +
    Inherited
    +
    +

    Returns the collection as JSON-encoded string

    + + + +
    magic
    +

    Returns

    +
    +string- JSON-encoded collection
    +
    +
    +
    +

    Factory method to construct a new collection

    +
    createFromArray(array $values) : \ArangoDBClient\Collection
    +
    +InheritedStatic +
    +
    +
    +

    Parameters

    +
    +

    $values

    +array
      +
    • initial values for collection
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +

    Returns

    +
    \ArangoDBClient\Collection
    +
    +
    +
    +

    Get all collection attributes

    +
    getAll() : array
    +
    Inherited
    +
    +
    +

    Returns

    +
    +array- array of all collection attributes
    +
    +
    +
    +

    Get the default collection type

    +
    getDefaultType() : string
    +
    +InheritedStatic +
    +
    +
    +

    Returns

    +
    +string- name
    +
    +
    +
    +

    Get the distributeShardsLike (if already known)

    +
    getDistributeShardsLike() : mixed
    +
    Inherited
    +
    +
    +

    Returns

    +
    +mixed- distributeShardsLike value
    +
    +
    +
    +

    Get the collection id (if already known)

    +
    getId() : mixed
    +
    Inherited
    +
    +

    Collection ids are generated on the server only.

    +

    Collection ids are numeric but might be bigger than PHP_INT_MAX. +To reliably store a collection id elsewhere, a PHP string should be used

    +

    Returns

    +
    +mixed- collection id, might be NULL if collection does not yet have an id
    +
    +
    +
    +

    Get the isSystem value (if already known)

    +
    getIsSystem() : boolean
    +
    Inherited
    +
    +
    +

    Returns

    +
    +boolean- isSystem value
    +
    +
    +
    +

    Get the isVolatile value (if already known)

    +
    getIsVolatile() : boolean
    +
    Inherited
    +
    +
    +

    Returns

    +
    +boolean- isVolatile value
    +
    +
    +
    +

    Get the journalSize value (if already known)

    +
    getJournalSize() : integer
    +
    Inherited
    +
    +
    +

    Returns

    +
    +integer- journalSize value
    +
    +
    +
    +

    Get the collection key options (if already known)

    +
    getKeyOptions() : array
    +
    Inherited
    +
    +
    +

    Returns

    +
    +array- keyOptions
    +
    +
    +
    +

    Get the minReplicationFactor value (if already known)

    +
    getMinReplicationFactor() : mixed
    +
    Inherited
    +
    +
    +

    Returns

    +
    +mixed- minReplicationFactor value
    +
    +
    +
    +

    Return the lock mode of the collection

    +
    getMode() : string
    +
    +
    +
    +

    Returns

    +
    +string- lock mode, i.e. 'read', 'write', 'exclusive'
    +
    +
    +
    +

    Return the name of the collection

    +
    getName() : string
    +
    +
    +
    + + + +
    inherited_from\ArangoDBClient\Collection::getName()
    +

    Returns

    +
    +string- collection name
    +
    +
    +
    +

    Get the collection name (if already known)

    +
    getName() : string
    +
    Inherited
    +
    +
    +

    Returns

    +
    +string- name
    +
    +
    +
    +

    Get the numberOfShards value (if already known)

    +
    getNumberOfShards() : mixed
    +
    Inherited
    +
    +
    +

    Returns

    +
    +mixed- numberOfShards value
    +
    +
    +
    +

    Get the replicationFactor value (if already known)

    +
    getReplicationFactor() : mixed
    +
    Inherited
    +
    +
    +

    Returns

    +
    +mixed- replicationFactor value
    +
    +
    +
    +

    Get the shardKeys value (if already known)

    +
    getShardKeys() : array
    +
    Inherited
    +
    +
    +

    Returns

    +
    +array- shardKeys value
    +
    +
    +
    +

    Get the sharding strategy value (if already known)

    +
    getShardingStrategy() : mixed
    +
    Inherited
    +
    +
    +

    Returns

    +
    +mixed- shardingStrategy value
    +
    +
    +
    +

    Get the smart join attribute value (if already known)

    +
    getSmartJoinAttribute() : mixed
    +
    Inherited
    +
    +
    +

    Returns

    +
    +mixed- smart join attribute value
    +
    +
    +
    +

    Get the collection status (if already known)

    +
    getStatus() : integer
    +
    Inherited
    +
    +
    +

    Returns

    +
    +integer- status
    +
    +
    +
    +

    Return the transaction's id

    +
    getTrxId() : string
    +
    +
    +
    +

    Returns

    +
    +string- transaction id
    +
    +
    +
    +

    Get the collection type (if already known)

    +
    getType() : string
    +
    Inherited
    +
    +
    +

    Returns

    +
    +string- name
    +
    +
    +
    +

    Get the waitForSync value (if already known)

    +
    getWaitForSync() : boolean
    +
    Inherited
    +
    +
    +

    Returns

    +
    +boolean- waitForSync value
    +
    +
    +
    +

    Set a collection attribute

    +
    set(string $key, mixed $value) : void
    +
    Inherited
    +
    +

    The key (attribute name) must be a string.

    +

    This will validate the value of the attribute and might throw an +exception if the value is invalid.

    +

    Parameters

    +
    +

    $key

    +string
      +
    • attribute name
    • +
    +
    +

    $value

    +mixed
      +
    • value for attribute
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Set the distribute shards like value

    +
    setDistributeShardsLike(string $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +string
      +
    • distributeShardsLike value
    • +
    +
    +
    +
    +

    Set the collection id

    +
    setId(mixed $id) : boolean
    +
    Inherited
    +
    +

    This will throw if the id of an existing collection gets updated to some other id

    +

    Parameters

    +
    +

    $id

    +mixed
      +
    • collection id
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +

    Returns

    +
    boolean
    +
    +
    +
    +

    Set the isSystem value

    +
    setIsSystem(boolean $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +boolean
      +
    • isSystem: false->user collection, true->system collection
    • +
    +
    +
    +
    +

    Set the isVolatile value

    +
    setIsVolatile(boolean $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +boolean
      +
    • isVolatile value
    • +
    +
    +
    +
    +

    Set the journalSize value

    +
    setJournalSize(integer $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +integer
      +
    • journalSize value
    • +
    +
    +
    +
    +

    Set the collection key options.

    +
    setKeyOptions(array $keyOptions) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $keyOptions

    +array
      +
    • An associative array containing optional keys: type, allowUserKeys, increment, offset.
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Set the minReplicationFactor value

    +
    setMinReplicationFactor(integer $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +integer
      +
    • minReplicationFactor value
    • +
    +
    +
    +
    +

    Set the collection name

    +
    setName(string $name) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $name

    +string
      +
    • name
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Set the numberOfShards value

    +
    setNumberOfShards(integer $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +integer
      +
    • numberOfShards value
    • +
    +
    +
    +
    +

    Set the replicationFactor value

    +
    setReplicationFactor(mixed $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +mixed
      +
    • replicationFactor value (either a number, or "satellite")
    • +
    +
    +
    +
    +

    Set the shardKeys value

    +
    setShardKeys(array $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +array
      +
    • shardKeys value
    • +
    +
    +
    +
    +

    Set the shardingStrategy value

    +
    setShardingStrategy(string $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +string
      +
    • shardingStrategy value
    • +
    +
    +
    +
    +

    Set the smart join attribute value

    +
    setSmartJoinAttribute(string $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +string
      +
    • smartJoinAttribute value
    • +
    +
    +
    +
    +

    Set the collection status.

    +
    setStatus(integer $status) : void
    +
    Inherited
    +
    +

    This is useful before a collection is create()'ed in order to set a status.

    +

    Parameters

    +
    +

    $status

    +integer
      +
    • statuses = 1 -> new born, status = 2 -> unloaded, status = 3 -> loaded, status = 4 -> being unloaded, status = 5 -> deleted
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Set the collection type.

    +
    setType(integer $type) : void
    +
    Inherited
    +
    +

    This is useful before a collection is create() 'ed in order to set a different type than the normal one. +For example this must be set to 3 in order to create an edge-collection.

    +

    Parameters

    +
    +

    $type

    +integer
      +
    • type = 2 -> normal collection, type = 3 -> edge-collection
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +
    +
    +
    +

    Set the waitForSync value

    +
    setWaitForSync(boolean $value) : void
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +boolean
      +
    • waitForSync value
    • +
    +
    +
    +
    +

    Returns the collection as JSON-encoded string

    +
    toJson() : string
    +
    Inherited
    +
    +
    +

    Returns

    +
    +string- JSON-encoded collection
    +
    +
    +
    +

    Returns the collection as a serialized string

    +
    toSerialized() : string
    +
    Inherited
    +
    +
    +

    Returns

    +
    +string- PHP serialized collection
    +
    +
    +

    + Properties

    + 
    +

    The distributeShardsLike value (might be NULL for new collections)

    +
    $_distributeShardsLike : mixed
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection id (might be NULL for new collections)

    +
    $_id : mixed
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection isSystem value (might be NULL for new collections)

    +
    $_isSystem : boolean
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection isVolatile value (might be NULL for new collections)

    +
    $_isVolatile : boolean
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection journalSize value (might be NULL for new collections)

    +
    $_journalSize : integer
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection keyOptions value

    +
    $_keyOptions : array
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The minimum replicationFactor value for writes to be successful

    +
    $_minReplicationFactor : mixed
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    Lock mode for this collection, i.e. 'read', 'write' or 'exclusive'

    +
    $_mode : string
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    Collection name - assigned on construction

    +
    $_name : string
    +
    +

    Default

    +
    +
    +
    +
    +
    + + + +
    inherited_from\ArangoDBClient\Collection::_name
    +
    +
    + 
    +

    The collection name (might be NULL for new collections)

    +
    $_name : string
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection numberOfShards value (might be NULL for new collections)

    +
    $_numberOfShards : mixed
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The replicationFactor value (might be NULL for new collections)

    +
    $_replicationFactor : mixed
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection shardKeys value (might be NULL for new collections)

    +
    $_shardKeys : array
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The shardingStrategy value (might be NULL for new collections)

    +
    $_shardingStrategy : mixed
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The smartJoinAttribute value (might be NULL for new collections)

    +
    $_smartJoinAttribute : mixed
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection status value

    +
    $_status : integer
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The transaction - assigned on construction

    +
    $_trx : \ArangoDBClient\StreamingTransaction
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection type (might be NULL for new collections)

    +
    $_type : integer
    +
    +

    Default

    +
    +
    +
    +
    +
    + 
    +

    The collection waitForSync value (might be NULL for new collections)

    +
    $_waitForSync : boolean
    +
    +

    Default

    +
    +
    +
    +
    +
    +

    + Constants

    + 
    +

    Collection 'distributeShardsLike' index

    +
    ENTRY_DISTRIBUTE_SHARDS_LIKE = 'distributeShardsLike' 
    +
    +
    +
    + 
    +

    Collection id index

    +
    ENTRY_ID = 'id' 
    +
    +
    +
    + 
    +

    Collection 'isSystem' index

    +
    ENTRY_IS_SYSTEM = 'isSystem' 
    +
    +
    +
    + 
    +

    Collection 'isVolatile' index

    +
    ENTRY_IS_VOLATILE = 'isVolatile' 
    +
    +
    +
    + 
    +

    Collection 'journalSize' index

    +
    ENTRY_JOURNAL_SIZE = 'journalSize' 
    +
    +
    +
    + 
    +

    Collection 'keyOptions' index

    +
    ENTRY_KEY_OPTIONS = 'keyOptions' 
    +
    +
    +
    + 
    +

    Collection 'minReplicationFactor' index

    +
    ENTRY_MIN_REPLICATION_FACTOR = 'minReplicationFactor' 
    +
    +
    +
    + 
    +

    Collection name index

    +
    ENTRY_NAME = 'name' 
    +
    +
    +
    + 
    +

    Collection 'numberOfShards' index

    +
    ENTRY_NUMBER_OF_SHARDS = 'numberOfShards' 
    +
    +
    +
    + 
    +

    Collection 'replicationFactor' index

    +
    ENTRY_REPLICATION_FACTOR = 'replicationFactor' 
    +
    +
    +
    + 
    +

    Collection 'shardingStrategy' index

    +
    ENTRY_SHARDING_STRATEGY = 'shardingStrategy' 
    +
    +
    +
    + 
    +

    Collection 'shardKeys' index

    +
    ENTRY_SHARD_KEYS = 'shardKeys' 
    +
    +
    +
    + 
    +

    Collection 'smartJoinAttribute' index

    +
    ENTRY_SMART_JOIN_ATTRIBUTE = 'smartJoinAttribute' 
    +
    +
    +
    + 
    +

    Collection 'status' index

    +
    ENTRY_STATUS = 'status' 
    +
    +
    +
    + 
    +

    Collection type index

    +
    ENTRY_TYPE = 'type' 
    +
    +
    +
    + 
    +

    Collection 'waitForSync' index

    +
    ENTRY_WAIT_SYNC = 'waitForSync' 
    +
    +
    +
    + 
    +

    properties option

    +
    OPTION_PROPERTIES = 'properties' 
    +
    +
    +
    + 
    +

    Collection being unloaded

    +
    STATUS_BEING_UNLOADED = 4 
    +
    +
    +
    + 
    +

    Deleted collection

    +
    STATUS_DELETED = 5 
    +
    +
    +
    + 
    +

    Loaded collection

    +
    STATUS_LOADED = 3 
    +
    +
    +
    + 
    +

    New born collection

    +
    STATUS_NEW_BORN = 1 
    +
    +
    +
    + 
    +

    Unloaded collection

    +
    STATUS_UNLOADED = 2 
    +
    +
    +
    + 
    +

    document collection type

    +
    TYPE_DOCUMENT = 2 
    +
    +
    +
    + 
    +

    edge collection type

    +
    TYPE_EDGE = 3 
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/classes/ArangoDBClient.StreamingTransactionHandler.html b/docs/classes/ArangoDBClient.StreamingTransactionHandler.html new file mode 100644 index 00000000..deb09a96 --- /dev/null +++ b/docs/classes/ArangoDBClient.StreamingTransactionHandler.html @@ -0,0 +1,509 @@ + + + + + +ArangoDB PHP client API » \ArangoDBClient\StreamingTransactionHandler + + + + + + + + + + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +

    Provides management of streaming transactions

    +
    +
    + + + + + + + + + + + + + +
    packageArangoDBClient
    since3.5
    inherited_from\ArangoDBClient\Handler
    +

    + Methods

    +
    +

    Construct a new streaming transaction handler

    +
    __construct(\ArangoDBClient\Connection $connection) 
    +
    +
    +
    + + + +
    inherited_from\ArangoDBClient\Handler::__construct()
    +

    Parameters

    +
    +

    $connection

    +\ArangoDBClient\Connection
      +
    • connection to be used
    • +
    +
    +
    +
    +

    Construct a new handler

    +
    __construct(\ArangoDBClient\Connection $connection) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $connection

    +\ArangoDBClient\Connection
      +
    • connection to be used
    • +
    +
    +
    +
    +

    Aborts a transaction

    +
    abort(mixed $trx) : boolean
    +
    +
    +
    +

    Parameters

    +
    +

    $trx

    +mixed
      +
    • streaming transaction object or transaction id as string
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ServerException
    +

    Returns

    +
    +boolean- true if abort succeeds, throws an exception otherwise
    +
    +
    +
    +

    Closes all pending transactions created by the handler

    +
    closePendingTransactions() 
    +
    +
    +
    +
    +

    Commits a transaction

    +
    commit(mixed $trx) : boolean
    +
    +
    +
    +

    Parameters

    +
    +

    $trx

    +mixed
      +
    • streaming transaction object or transaction id as string
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ServerException
    +

    Returns

    +
    +boolean- true if commit succeeds, throws an exception otherwise
    +
    +
    +
    +

    Creates a streaming transaction from scratch (no collections) or from an +existing transaction object (necessary when collections need to be passed +into the transaction or when an existing transaction is resumed)

    +
    create(\ArangoDBClient\StreamingTransaction $trx = null
    +
    +
    +
    +

    Parameters

    +
    +

    $trx

    +\ArangoDBClient\StreamingTransaction
      +
    • existing transaction
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ServerException
    +
    +
    +
    +

    Return all currently running transactions

    +
    getRunning() : array
    +
    +
    +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ServerException
    +

    Returns

    +
    +array- array of currently running transactions, each transaction is an array with attributes 'id' and 'status'
    +
    +
    +
    +

    Retrieves the status of a transaction

    +
    getStatus(mixed $trx) : array
    +
    +
    +
    +

    Parameters

    +
    +

    $trx

    +mixed
      +
    • streaming transaction object or transaction id as string
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ServerException
    +

    Returns

    +
    +array- returns an array with attributes 'id' and 'status'
    +
    +
    +
    +

    Sets the document class to use

    +
    setDocumentClass(string $class) : \ArangoDBClient\DocumentClassable
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $class

    +string

    Document class to use

    +

    Returns

    +
    \ArangoDBClient\DocumentClassable
    +
    +
    +
    +

    Sets the edge class to use

    +
    setEdgeClass(string $class) : \ArangoDBClient\DocumentClassable
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $class

    +string

    Edge class to use

    +

    Returns

    +
    \ArangoDBClient\DocumentClassable
    +
    +
    +
    +

    Steal the transaction from the handler, so that it is not responsible anymore +for auto-aborting it on shutdown

    +
    stealTransaction(string $id) 
    +
    +
    +
    +

    Parameters

    +
    +

    $id

    +string
      +
    • transaction id
    • +
    +
    +
    +
    +

    Add a transaction header to the array of headers in case this is a transactional operation

    +
    addTransactionHeader(array $headers, mixed $collection) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $headers

    +array
      +
    • already existing headers
    • +
    +
    +

    $collection

    +mixed
      +
    • any type of collection (can be StreamingTransactionCollection or other)
    • +
    +
    +
    +
    +

    Return the connection object

    +
    getConnection() : \ArangoDBClient\Connection
    +
    Inherited
    +
    +
    +

    Returns

    +
    +\ArangoDBClient\Connection- the connection object
    +
    +
    +
    +

    Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection

    +
    getConnectionOption($optionName) : mixed
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $optionName

      +
    • The option to return a value for
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +

    Returns

    +
    +mixed- the option's value
    +
    +
    +
    +

    Helper function that runs through the options given and includes them into the parameters array given.

    +
    includeOptionsInBody(array $options, array $body, array $includeArray = array()) : array
    +
    Inherited
    +
    +

    Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) .

    +

    Parameters

    +
    +

    $options

    +array
      +
    • The options array that holds the options to include in the parameters
    • +
    +
    +

    $body

    +array
      +
    • The array into which the options will be included.
    • +
    +
    +

    $includeArray

    +array
      +
    • The array that defines which options are allowed to be included, and what their default value is. for example: 'waitForSync'=>true
    • +
    +

    Returns

    +
    +array$params - array of parameters for use in a url
    +
    +
    +
    +

    Return a json encoded string for the array passed.

    +
    json_encode_wrapper(array $body) : string
    +
    Inherited
    +
    +

    This is a convenience function that calls json_encode_wrapper on the connection

    +

    Parameters

    +
    +

    $body

    +array
      +
    • The body to encode into json
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +

    Returns

    +
    +string- json string of the body that was passed
    +
    +
    +
    +

    Turn a value into a collection name

    +
    makeCollection(mixed $value) : string
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $value

    +mixed
      +
    • document, collection or string
    • +
    +

    Exceptions

    + + + +
    \ArangoDBClient\ClientException
    +

    Returns

    +
    +string- collection name
    +
    +
    +

    + Properties

    + 
    +

    Document class to use

    +
    $_documentClass : string
    +
    +

    Default

    +
    '\ArangoDBClient\Document'
    +
    +
    +
    +
    + 
    +

    Edge class to use

    +
    $_edgeClass : string
    +
    +

    Default

    +
    '\ArangoDBClient\Edge'
    +
    +
    +
    +
    + 
    +

    Connection object

    +
    $_connection 
    +
    +

    Default

    +
    +
    +
    +
    +
    + + + +
    param
    +
    +
    + 
    +

    $_pendingTransactions

    +
    $_pendingTransactions 
    +
    +

    Default

    +
    array()
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/classes/ArangoDBClient.TraceRequest.html b/docs/classes/ArangoDBClient.TraceRequest.html index 2f1636a6..dfef9fed 100644 --- a/docs/classes/ArangoDBClient.TraceRequest.html +++ b/docs/classes/ArangoDBClient.TraceRequest.html @@ -31,11 +31,11 @@ Reports @@ -252,7 +252,7 @@

    Default

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.TraceResponse.html b/docs/classes/ArangoDBClient.TraceResponse.html index 3e7222b3..310027a1 100644 --- a/docs/classes/ArangoDBClient.TraceResponse.html +++ b/docs/classes/ArangoDBClient.TraceResponse.html @@ -31,11 +31,11 @@ Reports @@ -271,7 +271,7 @@

    Default

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.Transaction.html b/docs/classes/ArangoDBClient.Transaction.html index 270cae0e..8f6e4532 100644 --- a/docs/classes/ArangoDBClient.Transaction.html +++ b/docs/classes/ArangoDBClient.Transaction.html @@ -31,11 +31,11 @@ Reports @@ -62,45 +62,60 @@  Methods @@ -137,7 +137,7 @@

    last update will win in case of conflicting versions

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.UrlHelper.html b/docs/classes/ArangoDBClient.UrlHelper.html index 076c7f08..183aad0a 100644 --- a/docs/classes/ArangoDBClient.UrlHelper.html +++ b/docs/classes/ArangoDBClient.UrlHelper.html @@ -31,11 +31,11 @@ Reports @@ -178,7 +178,7 @@

    Returns

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.Urls.html b/docs/classes/ArangoDBClient.Urls.html index 3baa0ebf..df53120e 100644 --- a/docs/classes/ArangoDBClient.Urls.html +++ b/docs/classes/ArangoDBClient.Urls.html @@ -31,11 +31,11 @@ Reports @@ -425,7 +425,7 @@

    URL for select-range

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.User.html b/docs/classes/ArangoDBClient.User.html index 9484c5f1..d72f4f9c 100644 --- a/docs/classes/ArangoDBClient.User.html +++ b/docs/classes/ArangoDBClient.User.html @@ -31,11 +31,11 @@ Reports @@ -136,6 +136,7 @@
  • isNew id index
    ENTRY_ISNEW
  • Document key index
    ENTRY_KEY
  • Revision id index
    ENTRY_REV
  • +
  • regular expression used for key validation
    KEY_REGEX_PART
  • keepNull option index
    OPTION_KEEPNULL
  • policy option index
    OPTION_POLICY
  • waitForSync option index
    OPTION_WAIT_FOR_SYNC
  • @@ -972,6 +973,12 @@

    Revision id index

    + 
    +

    regular expression used for key validation

    +
    KEY_REGEX_PART = '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' 
    +
    +
    +
     

    keepNull option index

    OPTION_KEEPNULL = 'keepNull' 
    @@ -997,7 +1004,7 @@

    waitForSync option index

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.UserHandler.html b/docs/classes/ArangoDBClient.UserHandler.html index 405b6226..0cc2d318 100644 --- a/docs/classes/ArangoDBClient.UserHandler.html +++ b/docs/classes/ArangoDBClient.UserHandler.html @@ -31,11 +31,11 @@ Reports @@ -82,6 +82,7 @@ @@ -131,6 +131,7 @@
  • isNew id index
    ENTRY_ISNEW
  • Document key index
    ENTRY_KEY
  • Revision id index
    ENTRY_REV
  • +
  • regular expression used for key validation
    KEY_REGEX_PART
  • keepNull option index
    OPTION_KEEPNULL
  • policy option index
    OPTION_POLICY
  • waitForSync option index
    OPTION_WAIT_FOR_SYNC
  • @@ -879,6 +880,12 @@

    Revision id index

    + 
    +

    regular expression used for key validation

    +
    KEY_REGEX_PART = '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' 
    +
    +
    +
     

    keepNull option index

    OPTION_KEEPNULL = 'keepNull' 
    @@ -904,7 +911,7 @@

    waitForSync option index

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.VertexHandler.html b/docs/classes/ArangoDBClient.VertexHandler.html index 724d1195..586474c7 100644 --- a/docs/classes/ArangoDBClient.VertexHandler.html +++ b/docs/classes/ArangoDBClient.VertexHandler.html @@ -31,11 +31,11 @@ Reports @@ -67,12 +67,12 @@
  • Get a single document from a collection
    getById()
  • Gets information about a single documents from a collection
    getHead()
  • Check if a document exists
    has()
  • -
  • Insert a document into a collection
    insert()
  • +
  • insert a document into a collection
    insert()
  • Remove a document from a collection, identified by the document itself
    remove()
  • Remove a document from a collection, identified by the collection id and document id
    removeById()
  • Replace an existing document in a collection, identified by the document itself
    replace()
  • Replace an existing document in a collection, identified by collection id and document id
    replaceById()
  • -
  • save a document to a collection
    save()
  • +
  • Insert a document into a collection
    save()
  • Sets the document class to use
    setDocumentClass()
  • Sets the edge class to use
    setEdgeClass()
  • Store a document to a collection
    store()
  • @@ -84,8 +84,7 @@ @@ -337,15 +338,47 @@

    Returns

    -

    Insert a document into a collection

    -
    insert($collection, $document, array $options = array()
    +

    insert a document into a collection

    +
    insert(mixed $collection, \ArangoDBClient\Document|array $document, array $options = array()) : mixed
    Inherited
    -

    This is an alias for save().

    +

    This will add the document to the collection and return the document's id

    +

    This will throw if the document cannot be saved

    + + + +
    since1.0

    Parameters

    -

    $collection

    -

    $document

    -

    $options

    +
    +

    $collection

    +mixed
      +
    • collection id as string or number
    • +
    +
    +

    $document

    +\ArangoDBClient\Documentarray
      +
    • the document to be added, can be passed as a document or an array
    • +
    +
    +

    $options

    +array
      +
    • optional, array of options +

      Options are :
      +

    • 'createCollection' - create the collection if it does not yet exist.
    • +
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • +
    • 'overwrite' - if set to true, will turn the insert into a replace operation if a document with the specified key already exists.
    • +
    • 'returnNew' - if set to true, then the newly created document will be returned.
    • +
    • 'returnOld' - if set to true, then the replaced document will be returned - useful only when using overwrite = true.
    • +

      +
    +

    Exceptions

    + + + +
    \ArangoDBClient\Exception
    +

    Returns

    +
    +mixed- id of document created
    @@ -425,8 +458,8 @@

    Replace an existing document in a collection, identified by the document its
    replace(\ArangoDBClient\Document $document, array $options = array()) : boolean
    Inherited
    -

    This will update the document on the server

    -

    This will throw if the document cannot be updated

    +

    This will replace the document on the server

    +

    This will throw if the document cannot be replaced

    If policy is set to error (locally or globally through the ConnectionOptions) and the passed document has a _rev value set, the database will check that the revision of the to-be-replaced document is the same as the one given.

    @@ -434,14 +467,14 @@

    Parameters

    $document

    \ArangoDBClient\Document
      -
    • document to be updated
    • +
    • document to be replaced

    $options

    array
    • optional, array of options

      Options are : -

    • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
    • +
    • 'policy' - replace policy to be used in case of conflict ('error', 'last' or NULL [use default])
    • 'waitForSync' - can be used to force synchronisation of the document update operation to disk even in case that the waitForSync flag had been disabled for the entire collection
    @@ -501,47 +534,15 @@

    Returns

    -

    save a document to a collection

    -
    save(mixed $collection, \ArangoDBClient\Document|array $document, array $options = array()) : mixed
    +

    Insert a document into a collection

    +
    save($collection, $document, array $options = array()
    Inherited
    -

    This will add the document to the collection and return the document's id

    -

    This will throw if the document cannot be saved

    - - - -
    since1.0
    +

    This is an alias for insert().

    Parameters

    -
    -

    $collection

    -mixed
      -
    • collection id as string or number
    • -
    -
    -

    $document

    -\ArangoDBClient\Documentarray
      -
    • the document to be added, can be passed as a document or an array
    • -
    -
    -

    $options

    -array
      -
    • optional, array of options -

      Options are :
      -

    • 'createCollection' - create the collection if it does not yet exist.
    • -
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • -
    • 'overwrite' - if set to true, will turn the insert into a replace operation if a document with the specified key already exists.
    • -
    • 'returnNew' - if set to true, then the newly created document will be returned.
    • -
    • 'returnOld' - if set to true, then the replaced document will be returned - useful only when using overwrite = true.
    • -

      -
    -

    Exceptions

    - - - -
    \ArangoDBClient\Exception
    -

    Returns

    -
    -mixed- id of document created
    +

    $collection

    +

    $document

    +

    $options

    @@ -698,25 +699,22 @@

    Returns

    boolean- always true, will throw if there is an error

    -
    -

    createCollectionIfOptions() -

    -
    createCollectionIfOptions($collection, array $options) 
    +
    +

    Add a transaction header to the array of headers in case this is a transactional operation

    +
    addTransactionHeader(array $headers, mixed $collection) 
    Inherited

    Parameters

    -

    $collection

    mixed collection name or id

    -
    -

    $options

    +

    $headers

    array
      -
    • optional, array of options -

      Options are : -

    • 'createCollection' - true to create the collection if it does not exist
    • -
    • 'createCollectionType' - "document" or 2 for document collection
    • -
    • "edge" or 3 for edge collection
    • -

      +
    • already existing headers
    • +
    +
    +

    $collection

    +mixed
      +
    • any type of collection (can be StreamingTransactionCollection or other)
    @@ -821,6 +819,29 @@

    Returns

    string- json string of the body that was passed
    +
    +

    lazyCreateCollection() +

    +
    lazyCreateCollection(mixed $collection, array $options) 
    +
    Inherited
    +
    +
    +

    Parameters

    +
    +

    $collection

    +mixed

    collection name or id

    +
    +

    $options

    +array
      +
    • optional, array of options +

      Options are : +

    • 'createCollectionType' - "document" or 2 for document collection
    • +
    • "edge" or 3 for edge collection
    • +
    • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
    • +

      +
    +
    +

    Turn a value into a collection name

    makeCollection(mixed $value) : string
    @@ -970,7 +991,7 @@

    option for returning the old document

    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/classes/ArangoDBClient.View.html b/docs/classes/ArangoDBClient.View.html index 3f108271..5de0ba56 100644 --- a/docs/classes/ArangoDBClient.View.html +++ b/docs/classes/ArangoDBClient.View.html @@ -31,11 +31,11 @@ Reports @@ -250,7 +250,7 @@

    View type index

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/classes/ArangoDBClient.ViewHandler.html b/docs/classes/ArangoDBClient.ViewHandler.html index b1f035b0..b1ef1fac 100644 --- a/docs/classes/ArangoDBClient.ViewHandler.html +++ b/docs/classes/ArangoDBClient.ViewHandler.html @@ -31,11 +31,11 @@ Reports @@ -74,6 +74,7 @@
  • Deprecated elements
  • +

    +CollectionHandler.php13 +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeLineDescription
    deprecated1009use CollectionHandler::createIndex instead
    deprecated1037use CollectionHandler::createIndex instead
    deprecated1073use CollectionHandler::createIndex instead
    deprecated1528use AQL queries instead
    deprecated1583use AQL queries instead
    deprecated1649use AQL queries instead
    deprecated1880use AQL queries instead
    deprecated1947use AQL queries instead
    deprecated2006use AQL queries instead
    deprecated878use CollectionHandler::createIndex instead
    deprecated911use CollectionHandler::createIndex instead
    deprecated942use CollectionHandler::createIndex instead
    deprecated976use CollectionHandler::createIndex instead

    UserHandler.php2

    @@ -86,7 +162,7 @@
    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/errors.html b/docs/errors.html index 9f008861..8db9fdeb 100644 --- a/docs/errors.html +++ b/docs/errors.html @@ -31,11 +31,11 @@ Reports @@ -54,18 +54,19 @@ -
  • Document.php
  • +
  • Endpoint.php
  • +
  • CollectionHandler.php
  • +
  • StreamingTransactionHandler.php
  • Connection.php
  • QueryCacheHandler.php
  • -
  • DocumentHandler.php
  • -
  • CollectionHandler.php
  • -
  • HttpResponse.php
  • -
  • Exception.php
  • -
  • Endpoint.php
  • +
  • Document.php
  • QueryHandler.php
  • +
  • DocumentHandler.php
  • Statement.php
  • -
  • EdgeHandler.php
  • +
  • Exception.php
  • +
  • HttpResponse.php
  • GraphHandler.php
  • +
  • EdgeHandler.php
  • +
    +
    +

    +EdgeHandler.php1 +

    +
    + + + + + + + + + + +
    TypeLineDescription
    error270No summary for method lazyCreateCollection()
    +
    +
    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/graph_class.html b/docs/graph_class.html index 94c50dda..dd580972 100644 --- a/docs/graph_class.html +++ b/docs/graph_class.html @@ -31,11 +31,11 @@ Reports @@ -62,7 +62,7 @@
    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/index.html b/docs/index.html index 8135cece..a457564e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -31,11 +31,11 @@ Reports @@ -71,18 +71,18 @@

    Documentation

    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/markers.html b/docs/markers.html index 933a03a2..c70c32cf 100644 --- a/docs/markers.html +++ b/docs/markers.html @@ -31,11 +31,11 @@ Reports @@ -63,7 +63,7 @@
    + generated on 2019-08-19T13:30:49+02:00.
    diff --git a/docs/namespaces/ArangoDBClient.html b/docs/namespaces/ArangoDBClient.html index 0fa1e79d..eed02a70 100644 --- a/docs/namespaces/ArangoDBClient.html +++ b/docs/namespaces/ArangoDBClient.html @@ -31,11 +31,11 @@ Reports @@ -63,55 +63,59 @@
  • DocumentClassable
  • -
  • AqlUserFunction
  • -
  • ViewHandler
  • -
  • BatchPart
  • -
  • View
  • -
  • UserHandler
  • -
  • Document
  • -
  • ConnectionOptions
  • -
  • Connection
  • +
  • Edge
  • Transaction
  • -
  • ExportCursor
  • +
  • StreamingTransaction
  • UrlHelper
  • -
  • QueryCacheHandler
  • -
  • DocumentHandler
  • -
  • Edge
  • -
  • Cursor
  • -
  • Database
  • -
  • FailoverException
  • +
  • Endpoint
  • Batch
  • -
  • TraceRequest
  • +
  • ExportCursor
  • +
  • FailoverException
  • ConnectException
  • -
  • ValueValidator
  • -
  • Autoloader
  • -
  • ClientException
  • -
  • FoxxHandler
  • +
  • Collection
  • +
  • TraceRequest
  • +
  • AqlUserFunction
  • +
  • Traversal
  • +
  • View
  • +
  • DefaultValues
  • User
  • -
  • BindVars
  • CollectionHandler
  • +
  • Database
  • +
  • StreamingTransactionHandler
  • +
  • BatchPart
  • +
  • FoxxHandler
  • +
  • Connection
  • +
  • TraceResponse
  • +
  • Autoloader
  • +
  • ServerException
  • +
  • UserHandler
  • +
  • QueryCacheHandler
  • +
  • HttpHelper
  • +
  • ViewHandler
  • +
  • Cursor
  • +
  • TransactionBase
  • Graph
  • -
  • EdgeDefinition
  • +
  • Document
  • Vertex
  • -
  • Collection
  • -
  • HttpResponse
  • -
  • HttpHelper
  • -
  • UpdatePolicy
  • -
  • Exception
  • -
  • Endpoint
  • QueryHandler
  • -
  • ServerException
  • +
  • DocumentHandler
  • +
  • Statement
  • +
  • Exception
  • Handler
  • -
  • Traversal
  • VertexHandler
  • -
  • Statement
  • +
  • HttpResponse
  • +
  • BindVars
  • +
  • UpdatePolicy
  • Urls
  • -
  • TraceResponse
  • -
  • AdminHandler
  • -
  • EdgeHandler
  • +
  • EdgeDefinition
  • +
  • ClientException
  • Export
  • +
  • ValueValidator
  • GraphHandler
  • -
  • DefaultValues
  • +
  • StreamingTransactionCollection
  • +
  • AdminHandler
  • +
  • EdgeHandler
  • +
  • ConnectionOptions
  • @@ -376,6 +380,27 @@

    Statement
    « More »

    +
    +

    StreamingTransaction +

    +

    Streaming transaction object

    +
    +« More » +
    +
    +

    StreamingTransactionCollection +

    +

    Streaming transaction collection object

    +
    +« More » +
    +
    +

    StreamingTransactionHandler +

    +

    Provides management of streaming transactions

    +
    +« More » +

    TraceRequest

    @@ -397,6 +422,13 @@

    Transaction
    « More »

    +
    +

    TransactionBase +

    +

    Transaction base class, used by Transaction and StreamingTransaction

    +
    +« More » +

    Traversal

    @@ -480,7 +512,7 @@

    ViewHandler
    + generated on 2019-08-19T13:30:48+02:00.

    diff --git a/docs/packages/ArangoDBClient.html b/docs/packages/ArangoDBClient.html index 390d3ed6..fc8b399c 100644 --- a/docs/packages/ArangoDBClient.html +++ b/docs/packages/ArangoDBClient.html @@ -31,11 +31,11 @@ Reports @@ -63,55 +63,59 @@
  • DocumentClassable
  • -
  • AqlUserFunction
  • -
  • ViewHandler
  • -
  • BatchPart
  • -
  • View
  • -
  • UserHandler
  • -
  • Document
  • -
  • ConnectionOptions
  • -
  • Connection
  • +
  • Edge
  • Transaction
  • -
  • ExportCursor
  • +
  • StreamingTransaction
  • UrlHelper
  • -
  • QueryCacheHandler
  • -
  • DocumentHandler
  • -
  • Edge
  • -
  • Cursor
  • -
  • Database
  • -
  • FailoverException
  • +
  • Endpoint
  • Batch
  • -
  • TraceRequest
  • +
  • ExportCursor
  • +
  • FailoverException
  • ConnectException
  • -
  • ValueValidator
  • -
  • Autoloader
  • -
  • ClientException
  • -
  • FoxxHandler
  • +
  • Collection
  • +
  • TraceRequest
  • +
  • AqlUserFunction
  • +
  • Traversal
  • +
  • View
  • +
  • DefaultValues
  • User
  • -
  • BindVars
  • CollectionHandler
  • +
  • Database
  • +
  • StreamingTransactionHandler
  • +
  • BatchPart
  • +
  • FoxxHandler
  • +
  • Connection
  • +
  • TraceResponse
  • +
  • Autoloader
  • +
  • ServerException
  • +
  • UserHandler
  • +
  • QueryCacheHandler
  • +
  • HttpHelper
  • +
  • ViewHandler
  • +
  • Cursor
  • +
  • TransactionBase
  • Graph
  • -
  • EdgeDefinition
  • +
  • Document
  • Vertex
  • -
  • Collection
  • -
  • HttpResponse
  • -
  • HttpHelper
  • -
  • UpdatePolicy
  • -
  • Exception
  • -
  • Endpoint
  • QueryHandler
  • -
  • ServerException
  • +
  • DocumentHandler
  • +
  • Statement
  • +
  • Exception
  • Handler
  • -
  • Traversal
  • VertexHandler
  • -
  • Statement
  • +
  • HttpResponse
  • +
  • BindVars
  • +
  • UpdatePolicy
  • Urls
  • -
  • TraceResponse
  • -
  • AdminHandler
  • -
  • EdgeHandler
  • +
  • EdgeDefinition
  • +
  • ClientException
  • Export
  • +
  • ValueValidator
  • GraphHandler
  • -
  • DefaultValues
  • +
  • StreamingTransactionCollection
  • +
  • AdminHandler
  • +
  • EdgeHandler
  • +
  • ConnectionOptions
  • @@ -373,6 +377,27 @@

    Statement
    « More »

    +
    +

    StreamingTransaction +

    +

    Streaming transaction object

    +
    +« More » +
    +
    +

    StreamingTransactionCollection +

    +

    Streaming transaction collection object

    +
    +« More » +
    +
    +

    StreamingTransactionHandler +

    +

    Provides management of streaming transactions

    +
    +« More » +

    TraceRequest

    @@ -394,6 +419,13 @@

    Transaction
    « More »

    +
    +

    TransactionBase +

    +

    Transaction base class, used by Transaction and StreamingTransaction

    +
    +« More » +

    Traversal

    @@ -477,7 +509,7 @@

    ViewHandler
    + generated on 2019-08-19T13:30:48+02:00.

    diff --git a/docs/packages/Default.html b/docs/packages/Default.html index 5565db20..966013a2 100644 --- a/docs/packages/Default.html +++ b/docs/packages/Default.html @@ -31,11 +31,11 @@ Reports @@ -65,7 +65,7 @@
    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/packages/global.html b/docs/packages/global.html index 380e3b86..7bbe32ff 100644 --- a/docs/packages/global.html +++ b/docs/packages/global.html @@ -31,11 +31,11 @@ Reports @@ -65,7 +65,7 @@
    + generated on 2019-08-19T13:30:48+02:00.
    diff --git a/docs/structure.xml b/docs/structure.xml index 14c783e9..c80a6b91 100644 --- a/docs/structure.xml +++ b/docs/structure.xml @@ -1,344 +1,538 @@ - + - ArangoDB PHP client: AqlUserFunction + ArangoDB PHP client: single document - - - + + + - - - AqlUserFunction - \ArangoDBClient\AqlUserFunction - - Provides management of user-functions - AqlUserFunction object<br> -An AqlUserFunction is an object that is used to manage AQL User Functions.<br> -It registers, un-registers and lists user functions on the server<br> -<br> -The object encapsulates:<br> -<br> -<ul> -<li> the name of the function -<li> the actual javascript function -</ul> -<br> -The object requires the connection object and can be initialized -with or without initial configuration.<br> -<br> -Any configuration can be set and retrieved by the object's methods like this:<br> -<br> -<pre> -$this->setName('myFunctions:myFunction');<br> -$this->setCode('function (){your code};'); -</pre> - -<br> -or like this:<br> -<br> -<pre> -$this->name('myFunctions:myFunction');<br> -$this->code('function (){your code};'); -</pre> - - + + \ArangoDBClient\Document + Edge + \ArangoDBClient\Edge + + Value object representing a single collection-based edge document + <br> + + + - - ENTRY_NAME - \ArangoDBClient\AqlUserFunction::ENTRY_NAME - 'name' - - Collections index + + ENTRY_FROM + \ArangoDBClient\Edge::ENTRY_FROM + '_from' + + Document _from index - - ENTRY_CODE - \ArangoDBClient\AqlUserFunction::ENTRY_CODE - 'code' - - Action index + + ENTRY_TO + \ArangoDBClient\Edge::ENTRY_TO + '_to' + + Revision _to index - - $_connection - \ArangoDBClient\AqlUserFunction::_connection + + ENTRY_ID + \ArangoDBClient\Document::ENTRY_ID + '_id' + + Document id index + + + + + ENTRY_KEY + \ArangoDBClient\Document::ENTRY_KEY + '_key' + + Document key index + + + + + ENTRY_REV + \ArangoDBClient\Document::ENTRY_REV + '_rev' + + Revision id index + + + + + ENTRY_ISNEW + \ArangoDBClient\Document::ENTRY_ISNEW + '_isNew' + + isNew id index + + + + + ENTRY_HIDDENATTRIBUTES + \ArangoDBClient\Document::ENTRY_HIDDENATTRIBUTES + '_hiddenAttributes' + + hidden attribute index + + + + + ENTRY_IGNOREHIDDENATTRIBUTES + \ArangoDBClient\Document::ENTRY_IGNOREHIDDENATTRIBUTES + '_ignoreHiddenAttributes' + + hidden attribute index + + + + + OPTION_WAIT_FOR_SYNC + \ArangoDBClient\Document::OPTION_WAIT_FOR_SYNC + 'waitForSync' + + waitForSync option index + + + + + OPTION_POLICY + \ArangoDBClient\Document::OPTION_POLICY + 'policy' + + policy option index + + + + + OPTION_KEEPNULL + \ArangoDBClient\Document::OPTION_KEEPNULL + 'keepNull' + + keepNull option index + + + + + KEY_REGEX_PART + \ArangoDBClient\Document::KEY_REGEX_PART + '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' + + regular expression used for key validation + + + + + $_from + \ArangoDBClient\Edge::_from - - The connection object + + The edge's from (might be NULL for new documents) - - \ArangoDBClient\Connection + + mixed - - $attributes - \ArangoDBClient\AqlUserFunction::attributes - array() - - The transaction's attributes. + + $_to + \ArangoDBClient\Edge::_to + + + The edge's to (might be NULL for new documents) - - array + + mixed - - $_action - \ArangoDBClient\AqlUserFunction::_action - '' - - The transaction's action. + + $_id + \ArangoDBClient\Document::_id + + + The document id (might be NULL for new documents) - + string - - __construct - \ArangoDBClient\AqlUserFunction::__construct() - - Initialise the AqlUserFunction object - The $attributesArray array can be used to specify the name and code for the user function in form of an array. - -Example: -array( - 'name' => 'myFunctions:myFunction', - 'code' => 'function (){}' -) - - \ArangoDBClient\Connection + + $_key + \ArangoDBClient\Document::_key + + + The document key (might be NULL for new documents) + + + string + + + + + $_rev + \ArangoDBClient\Document::_rev + + + The document revision (might be NULL for new documents) + + + mixed - + + + + $_values + \ArangoDBClient\Document::_values + array() + + The document attributes (names/values) + + array - - \ArangoDBClient\ClientException + + + + $_changed + \ArangoDBClient\Document::_changed + false + + Flag to indicate whether document was changed locally + + + boolean - - $connection - - \ArangoDBClient\Connection - - - $attributesArray - null - array - - - - register - \ArangoDBClient\AqlUserFunction::register() - - Registers the user function - If no parameters ($name,$code) are passed, it will use the properties of the object. - -If $name and/or $code are passed, it will override the object's properties with the passed ones - - null + + + $_isNew + \ArangoDBClient\Document::_isNew + true + + Flag to indicate whether document is a new document (never been saved to the server) + + + boolean - - null + + + + $_doValidate + \ArangoDBClient\Document::_doValidate + false + + Flag to indicate whether validation of document values should be performed +This can be turned on, but has a performance penalty + + + boolean - - \ArangoDBClient\Exception + + + + $_hiddenAttributes + \ArangoDBClient\Document::_hiddenAttributes + array() + + An array, that defines which attributes should be treated as hidden. + + + array - - mixed + + + + $_ignoreHiddenAttributes + \ArangoDBClient\Document::_ignoreHiddenAttributes + false + + Flag to indicate whether hidden attributes should be ignored or included in returned data-sets + + + boolean - - $name - null - null - - - $code - null - null - - - - unregister - \ArangoDBClient\AqlUserFunction::unregister() - - Un-register the user function - If no parameter ($name) is passed, it will use the property of the object. + + + set + \ArangoDBClient\Edge::set() + + Set a document attribute + The key (attribute name) must be a string. -If $name is passed, it will override the object's property with the passed one - - string - - - boolean +This will validate the value of the attribute and might throw an +exception if the value is invalid. + + \ArangoDBClient\ClientException - - \ArangoDBClient\Exception + + string - + mixed + + void + + - $name - null + $key + string - $namespace - false - boolean + $value + + mixed - - getRegisteredUserFunctions - \ArangoDBClient\AqlUserFunction::getRegisteredUserFunctions() - - Get registered user functions - The method can optionally be passed a $namespace parameter to narrow the results down to a specific namespace. - - null - - - \ArangoDBClient\Exception - - + + setFrom + \ArangoDBClient\Edge::setFrom() + + Set the 'from' vertex document-handler + + mixed + + \ArangoDBClient\Edge + - $namespace - null - null + $from + + mixed - - getConnection - \ArangoDBClient\AqlUserFunction::getConnection() - - Return the connection object + + getFrom + \ArangoDBClient\Edge::getFrom() + + Get the 'from' vertex document-handler (if already known) - - \ArangoDBClient\Connection + + mixed - - setName - \ArangoDBClient\AqlUserFunction::setName() - - Set name of the user function. It must have at least one namespace, but also can have sub-namespaces. - correct: -'myNamespace:myFunction' -'myRootNamespace:mySubNamespace:myFunction' - -wrong: -'myFunction' - - string + + setTo + \ArangoDBClient\Edge::setTo() + + Set the 'to' vertex document-handler + + + mixed - - \ArangoDBClient\ClientException + + \ArangoDBClient\Edge - $value + $to - string + mixed - - getName - \ArangoDBClient\AqlUserFunction::getName() - - Get name value + + getTo + \ArangoDBClient\Edge::getTo() + + Get the 'to' vertex document-handler (if already known) - - string + + mixed - - setCode - \ArangoDBClient\AqlUserFunction::setCode() - - Set user function code + + getAllForInsertUpdate + \ArangoDBClient\Edge::getAllForInsertUpdate() + + Get all document attributes for insertion/update - - string - - - \ArangoDBClient\ClientException + + mixed + - - $value - - string - - - getCode - \ArangoDBClient\AqlUserFunction::getCode() - - Get user function code + + __construct + \ArangoDBClient\Document::__construct() + + Constructs an empty document - - string + + array + + $options + null + array + + \ArangoDBClient\Document - - set - \ArangoDBClient\AqlUserFunction::set() - - Set an attribute + + createFromArray + \ArangoDBClient\Document::createFromArray() + + Factory method to construct a new document using the values passed to populate it - - - - \ArangoDBClient\AqlUserFunction - - + \ArangoDBClient\ClientException - + + array + + + array + + + \ArangoDBClient\Document + \ArangoDBClient\Edge + \ArangoDBClient\Graph + - $key + $values - + array - $value - - + $options + array() + array + \ArangoDBClient\Document - - __set - \ArangoDBClient\AqlUserFunction::__set() - - Set an attribute, magic method - This is a magic method that allows the object to be used without -declaring all attributes first. - + + __clone + \ArangoDBClient\Document::__clone() + + Clone a document + Returns the clone + + + void + + + \ArangoDBClient\Document + + + __toString + \ArangoDBClient\Document::__toString() + + Get a string representation of the document. + It will not output hidden attributes. + +Returns the document as JSON-encoded string + + + string + + + \ArangoDBClient\Document + + + toJson + \ArangoDBClient\Document::toJson() + + Returns the document as JSON-encoded string + + + array + + + string + + + + $options + array() + array + + \ArangoDBClient\Document + + + toSerialized + \ArangoDBClient\Document::toSerialized() + + Returns the document as a serialized string + + + array + + + string + + + + $options + array() + array + + \ArangoDBClient\Document + + + filterHiddenAttributes + \ArangoDBClient\Document::filterHiddenAttributes() + + Returns the attributes with the hidden ones removed + + + array + + + array + + + array + + + + $attributes + + array + + + $_hiddenAttributes + array() + array + + \ArangoDBClient\Document + + + set + \ArangoDBClient\Document::set() + + Set a document attribute + The key (attribute name) must be a string. +This will validate the value of the attribute and might throw an +exception if the value is invalid. + \ArangoDBClient\ClientException - - + string - + mixed + + void + $key @@ -350,37 +544,53 @@ declaring all attributes first. mixed + \ArangoDBClient\Document - - get - \ArangoDBClient\AqlUserFunction::get() - - Get an attribute - - + + __set + \ArangoDBClient\Document::__set() + + Set a document attribute, magic method + This is a magic method that allows the object to be used without +declaring all document attributes first. +This function is mapped to set() internally. + + \ArangoDBClient\ClientException + + + string - + mixed + + void + $key string + + $value + + mixed + + \ArangoDBClient\Document - - __isset - \ArangoDBClient\AqlUserFunction::__isset() - - Is triggered by calling isset() or empty() on inaccessible properties. + + get + \ArangoDBClient\Document::get() + + Get a document attribute - + string - - boolean + + mixed @@ -388,18 +598,19 @@ declaring all attributes first. string + \ArangoDBClient\Document - + __get - \ArangoDBClient\AqlUserFunction::__get() - - Get an attribute, magic method + \ArangoDBClient\Document::__get() + + Get a document attribute, magic method This function is mapped to get() internally. - - + + string - + mixed @@ -408,4544 +619,4978 @@ declaring all attributes first. string + \ArangoDBClient\Document - - __toString - \ArangoDBClient\AqlUserFunction::__toString() - - Returns the action string + + __isset + \ArangoDBClient\Document::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. - - + string + + boolean + + + $key + + string + + \ArangoDBClient\Document - - buildAttributesFromArray - \ArangoDBClient\AqlUserFunction::buildAttributesFromArray() - - Build the object's attributes from a given array - - - - \ArangoDBClient\ClientException - + + __unset + \ArangoDBClient\Document::__unset() + + Magic method to unset an attribute. + Caution!!! This works only on the first array level. +The preferred method to unset attributes in the database, is to set those to null and do an update() with the option: 'keepNull' => false. + + - $options + $key + \ArangoDBClient\Document - - $name - - - - The name of the user function - - - string + + getAll + \ArangoDBClient\Document::getAll() + + Get all document attributes + + + mixed - - - string + + array - - - $code - - - - The code of the user function - - - string + + $options + array() + mixed + + \ArangoDBClient\Document + + + getAllForInsertUpdate + \ArangoDBClient\Document::getAllForInsertUpdate() + + Get all document attributes for insertion/update + + + mixed - - - string + + \ArangoDBClient\Document + + + getAllAsObject + \ArangoDBClient\Document::getAllAsObject() + + Get all document attributes, and return an empty object if the documentapped into a DocumentWrapper class + + + mixed + + + mixed - - - - - - _action - - - string + + $options + array() + mixed + + \ArangoDBClient\Document + + + setHiddenAttributes + \ArangoDBClient\Document::setHiddenAttributes() + + Set the hidden attributes +$cursor + + + array - - - string + + void - - - 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 - - - - ArangoDB PHP client: view handler - - - - - - - - \ArangoDBClient\Handler - ViewHandler - \ArangoDBClient\ViewHandler - - A handler that manages views. - - - - - - - OPTION_RENAME - \ArangoDBClient\ViewHandler::OPTION_RENAME - 'rename' - - rename option - - - - - $_connection - \ArangoDBClient\Handler::_connection - - - Connection object + + $attributes + + array + + \ArangoDBClient\Document + + + getHiddenAttributes + \ArangoDBClient\Document::getHiddenAttributes() + + Get the hidden attributes - - \ArangoDBClient\Connection + + array - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - + \ArangoDBClient\Document + + + isIgnoreHiddenAttributes + \ArangoDBClient\Document::isIgnoreHiddenAttributes() + - - string + + boolean - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - + \ArangoDBClient\Document + + + setIgnoreHiddenAttributes + \ArangoDBClient\Document::setIgnoreHiddenAttributes() + - - string - - - - - create - \ArangoDBClient\ViewHandler::create() - - Create a view - This will create a view using the given view object and return an array of the created view object's attributes.<br><br> - - \ArangoDBClient\Exception - - - \ArangoDBClient\View - - - array + + boolean - - $view + $ignoreHiddenAttributes - \ArangoDBClient\View + boolean + \ArangoDBClient\Document - - get - \ArangoDBClient\ViewHandler::get() - - Get a view - This will get a view.<br><br> - - String - - - \ArangoDBClient\View - false + + setChanged + \ArangoDBClient\Document::setChanged() + + Set the changed flag + + + boolean - - \ArangoDBClient\ClientException + + boolean - - $view + $value - String + boolean + \ArangoDBClient\Document - - properties - \ArangoDBClient\ViewHandler::properties() - - Get a view's properties<br><br> + + getChanged + \ArangoDBClient\Document::getChanged() + + Get the changed flag - - \ArangoDBClient\Exception - - - mixed - - - array + + boolean - - - $view - - mixed - + \ArangoDBClient\Document - - setProperties - \ArangoDBClient\ViewHandler::setProperties() - - Set a view's properties<br><br> + + setIsNew + \ArangoDBClient\Document::setIsNew() + + Set the isNew flag - - \ArangoDBClient\Exception - - - mixed - - - array + + boolean - - array + + void - - $view - - mixed - - - $properties + $isNew - array + boolean + \ArangoDBClient\Document - - drop - \ArangoDBClient\ViewHandler::drop() - - Drop a view<br><br> + + getIsNew + \ArangoDBClient\Document::getIsNew() + + Get the isNew flag - - \ArangoDBClient\Exception + + boolean - - mixed + + \ArangoDBClient\Document + + + setInternalId + \ArangoDBClient\Document::setInternalId() + + Set the internal document id + This will throw if the id of an existing document gets updated to some other id + + \ArangoDBClient\ClientException - - boolean + + string + + + void - - $view + $id - mixed + string + \ArangoDBClient\Document - - rename - \ArangoDBClient\ViewHandler::rename() - - Rename a view - - - \ArangoDBClient\Exception - - - mixed + + setInternalKey + \ArangoDBClient\Document::setInternalKey() + + Set the internal document key + This will throw if the key of an existing document gets updated to some other key + + \ArangoDBClient\ClientException - + string - - boolean + + void - $view - - mixed - - - $name + $key string + \ArangoDBClient\Document - - __construct - \ArangoDBClient\Handler::__construct() - - Construct a new handler - - - \ArangoDBClient\Connection + + getInternalId + \ArangoDBClient\Document::getInternalId() + + Get the internal document id (if already known) + Document ids are generated on the server only. Document ids consist of collection id and +document id, in the format collectionId/documentId + + string - - $connection - - \ArangoDBClient\Connection - - \ArangoDBClient\Handler + \ArangoDBClient\Document - - getConnection - \ArangoDBClient\Handler::getConnection() - - Return the connection object + + getInternalKey + \ArangoDBClient\Document::getInternalKey() + + Get the internal document key (if already known) - - \ArangoDBClient\Connection + + string - \ArangoDBClient\Handler + \ArangoDBClient\Document - - getConnectionOption - \ArangoDBClient\Handler::getConnectionOption() - - Return a connection option -This is a convenience function that calls json_encode_wrapper on the connection - - - - mixed - - - \ArangoDBClient\ClientException + + getHandle + \ArangoDBClient\Document::getHandle() + + Convenience function to get the document handle (if already known) - is an alias to getInternalId() + Document handles are generated on the server only. Document handles consist of collection id and +document id, in the format collectionId/documentId + + string - - $optionName - - - - \ArangoDBClient\Handler + \ArangoDBClient\Document - - json_encode_wrapper - \ArangoDBClient\Handler::json_encode_wrapper() - - Return a json encoded string for the array passed. - This is a convenience function that calls json_encode_wrapper on the connection - - array - - - string - - - \ArangoDBClient\ClientException + + getId + \ArangoDBClient\Document::getId() + + Get the document id (or document handle) if already known. + It is a string and consists of the collection's name and the document key (_key attribute) separated by /. +Example: (collectionname/documentId) + +The document handle is stored in a document's _id attribute. + + mixed - - $body - - array - - \ArangoDBClient\Handler + \ArangoDBClient\Document - - includeOptionsInBody - \ArangoDBClient\Handler::includeOptionsInBody() - - Helper function that runs through the options given and includes them into the parameters array given. - Only options that are set in $includeArray will be included. -This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - - array - - - array - - - array - - - array + + getKey + \ArangoDBClient\Document::getKey() + + Get the document key (if already known). + Alias function for getInternalKey() + + mixed - - $options - - array - - - $body - - array - - - $includeArray - array() - array - - \ArangoDBClient\Handler + \ArangoDBClient\Document - - makeCollection - \ArangoDBClient\Handler::makeCollection() - - Turn a value into a collection name - - - \ArangoDBClient\ClientException + + getCollectionId + \ArangoDBClient\Document::getCollectionId() + + Get the collection id (if already known) + Collection ids are generated on the server only. Collection ids are numeric but might be +bigger than PHP_INT_MAX. To reliably store a collection id elsewhere, a PHP string should be used + + mixed - + + \ArangoDBClient\Document + + + setRevision + \ArangoDBClient\Document::setRevision() + + Set the document revision + Revision ids are generated on the server only. + +Document ids are strings, even if they look "numeric" +To reliably store a document id elsewhere, a PHP string must be used + mixed - - string + + void - $value + $rev mixed - \ArangoDBClient\Handler + \ArangoDBClient\Document - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use + + getRevision + \ArangoDBClient\Document::getRevision() + + Get the document revision (if already known) - - string - - - \ArangoDBClient\DocumentClassable + + mixed - - $class - - string - - \ArangoDBClient\DocumentClassable + \ArangoDBClient\Document - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use + + jsonSerialize + \ArangoDBClient\Document::jsonSerialize() + + Get all document attributes +Alias function for getAll() - it's necessary for implementing JsonSerializable interface - - string + + mixed - - \ArangoDBClient\DocumentClassable + + array - $class - - string + $options + array() + mixed - \ArangoDBClient\DocumentClassable + \ArangoDBClient\Document - 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 - + - ArangoDB PHP client: batchpart + ArangoDB PHP client: transaction - + - - - BatchPart - \ArangoDBClient\BatchPart - - Provides batch part functionality - - - + + \ArangoDBClient\TransactionBase + Transaction + \ArangoDBClient\Transaction + + Transaction object + A transaction is an object that is used to prepare and send a transaction +to the server. + +The object encapsulates:<br /> +<ul> +<li> the collections definitions for locking +<li> the actual javascript function +<li> additional options like waitForSync, lockTimeout and params +</ul> + +The transaction object requires the connection object and can be initialized +with or without initial transaction configuration. +Any configuration can be set and retrieved by the object's methods like this:<br /> + +<pre> +$this->setAction('function (){your code};'); +$this->setCollections(array('read' => 'my_read_collection, 'write' => array('col_1', 'col2'))); +</pre> +<br /> +or like this: +<pre> +$this->action('function (){your code};'); +$this->collections(array('read' => 'my_read_collection, 'write' => array('col_1', 'col2'))); +</pre> +<br /> +There are also helper functions to set collections directly, based on their locking: +<pre> +$this->setReadCollections($array or $string if single collection) +$this->setWriteCollections($array or $string if single collection) +$this->setExclusiveCollections($array or $string if single collection) +</pre> +<br /> + + + - - $_cursorOptions - \ArangoDBClient\BatchPart::_cursorOptions - array() - - An array of BatchPartCursor options + + ENTRY_ACTION + \ArangoDBClient\Transaction::ENTRY_ACTION + 'action' + + Action index - - array - - - - $_id - \ArangoDBClient\BatchPart::_id - - - An array of BatchPartCursor options - - - array - + + + ENTRY_PARAMS + \ArangoDBClient\Transaction::ENTRY_PARAMS + 'params' + + Params index + - - - $_type - \ArangoDBClient\BatchPart::_type - - - An array of BatchPartCursor options + + + ENTRY_COLLECTIONS + \ArangoDBClient\TransactionBase::ENTRY_COLLECTIONS + 'collections' + + Collections index - - array - - - - $_request - \ArangoDBClient\BatchPart::_request - array() - - An array of BatchPartCursor options + + + ENTRY_WAIT_FOR_SYNC + \ArangoDBClient\TransactionBase::ENTRY_WAIT_FOR_SYNC + 'waitForSync' + + WaitForSync index - - array - - - - $_response - \ArangoDBClient\BatchPart::_response - array() - - An array of BatchPartCursor options + + + ENTRY_LOCK_TIMEOUT + \ArangoDBClient\TransactionBase::ENTRY_LOCK_TIMEOUT + 'lockTimeout' + + Lock timeout index - - \ArangoDBClient\HttpResponse - - - - $_batch - \ArangoDBClient\BatchPart::_batch + + + ENTRY_READ + \ArangoDBClient\TransactionBase::ENTRY_READ + 'read' + + Read index + + + + + ENTRY_WRITE + \ArangoDBClient\TransactionBase::ENTRY_WRITE + 'write' + + WRITE index + + + + + ENTRY_EXCLUSIVE + \ArangoDBClient\TransactionBase::ENTRY_EXCLUSIVE + 'exclusive' + + EXCLUSIVE index + + + + + $_action + \ArangoDBClient\Transaction::_action - - The batch that this instance is part of + + - - \ArangoDBClient\Batch - + - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - + + $_connection + \ArangoDBClient\TransactionBase::_connection + + + The connection object - - string + + \ArangoDBClient\Connection - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - + + $attributes + \ArangoDBClient\TransactionBase::attributes + array() + + The transaction's attributes. - - string + + array - + __construct - \ArangoDBClient\BatchPart::__construct() - - Constructor - - - \ArangoDBClient\Batch - - - mixed - - - mixed - - - mixed + \ArangoDBClient\Transaction::__construct() + + Initialise the transaction object + The $transaction array can be used to specify the collections, action and further +options for the transaction in form of an array. + +Example: +array( + 'collections' => array( + 'write' => array( + 'my_collection' + ) + ), + 'action' => 'function (){}', + 'waitForSync' => true +) + + \ArangoDBClient\Connection - - mixed + + array - - mixed + + \ArangoDBClient\ClientException + - $batch - - \ArangoDBClient\Batch - - - $id - - mixed - - - $type - - mixed - - - $request - - mixed - - - $response + $connection - mixed + \ArangoDBClient\Connection - $options - - mixed + $transactionArray + null + array - - setBatch - \ArangoDBClient\BatchPart::setBatch() - - Sets the id for the current batch part. - - - \ArangoDBClient\Batch + + execute + \ArangoDBClient\Transaction::execute() + + Execute the transaction + This will post the query to the server and return the results as +a Cursor. The cursor can then be used to iterate the results. + + \ArangoDBClient\Exception - - \ArangoDBClient\BatchPart + + mixed - - $batch - - \ArangoDBClient\Batch - - - setId - \ArangoDBClient\BatchPart::setId() - - Sets the id for the current batch part. + + setAction + \ArangoDBClient\Transaction::setAction() + + set action value - - mixed + + string - - \ArangoDBClient\BatchPart + + \ArangoDBClient\ClientException - $id + $value - mixed + string - - getId - \ArangoDBClient\BatchPart::getId() - - Gets the id for the current batch part. + + getAction + \ArangoDBClient\Transaction::getAction() + + get action value - - mixed + + string - - setType - \ArangoDBClient\BatchPart::setType() - - Sets the type for the current batch part. + + setParams + \ArangoDBClient\Transaction::setParams() + + Set params value - - mixed + + array - - \ArangoDBClient\BatchPart + + \ArangoDBClient\ClientException - $type + $value - mixed + array - - getType - \ArangoDBClient\BatchPart::getType() - - Gets the type for the current batch part. + + getParams + \ArangoDBClient\Transaction::getParams() + + Get params value - - mixed + + array - - setRequest - \ArangoDBClient\BatchPart::setRequest() - - Sets the request for the current batch part. + + set + \ArangoDBClient\Transaction::set() + + Sets an attribute - + + + + \ArangoDBClient\ClientException + + + + + $key + + + + + $value + + + + + + __set + \ArangoDBClient\Transaction::__set() + + Set an attribute, magic method + This is a magic method that allows the object to be used without +declaring all document attributes first. + + \ArangoDBClient\ClientException + + + + string + + mixed - - \ArangoDBClient\BatchPart + + void + - $request + $key + + string + + + $value mixed - - getRequest - \ArangoDBClient\BatchPart::getRequest() - - Gets the request for the current batch part. - - - array + + __get + \ArangoDBClient\Transaction::__get() + + Get an attribute, magic method + This function is mapped to get() internally. + + + string + + mixed + + + + $key + + string + - - setResponse - \ArangoDBClient\BatchPart::setResponse() - - Sets the response for the current batch part. + + __isset + \ArangoDBClient\Transaction::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. - - mixed + + string - - \ArangoDBClient\BatchPart + + boolean + - $response + $key - mixed + string - - getResponse - \ArangoDBClient\BatchPart::getResponse() - - Gets the response for the current batch part. + + __toString + \ArangoDBClient\Transaction::__toString() + + Returns the action string - - \ArangoDBClient\HttpResponse + + + string - - getHttpCode - \ArangoDBClient\BatchPart::getHttpCode() - - Gets the HttpCode for the current batch part. + + buildTransactionAttributesFromArray + \ArangoDBClient\Transaction::buildTransactionAttributesFromArray() + + Build the object's attributes from a given array - - integer + + + \ArangoDBClient\ClientException + + + $options + + + - - getProcessedResponse - \ArangoDBClient\BatchPart::getProcessedResponse() - - Get the batch part identified by the array key (0. - ..n) or its id (if it was set with nextBatchPartId($id) ) - - \ArangoDBClient\ClientException + + __construct + \ArangoDBClient\TransactionBase::__construct() + + Initialise the transaction object + + + \ArangoDBClient\Connection - - mixed + + \ArangoDBClient\ClientException + + $connection + + \ArangoDBClient\Connection + + \ArangoDBClient\TransactionBase - - getCursorOptions - \ArangoDBClient\BatchPart::getCursorOptions() - - Return an array of cursor options + + getConnection + \ArangoDBClient\TransactionBase::getConnection() + + Return the connection object - + + \ArangoDBClient\Connection + + + \ArangoDBClient\TransactionBase + + + setCollections + \ArangoDBClient\TransactionBase::setCollections() + + Set the collections array. + The array should have 2 sub-arrays, namely 'read' and 'write' which should hold the respective collections +for the transaction + array + + $value + + array + + \ArangoDBClient\TransactionBase - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use + + getCollections + \ArangoDBClient\TransactionBase::getCollections() + + Get collections array + This holds the read and write collections of the transaction + + array + + + \ArangoDBClient\TransactionBase + + + setWaitForSync + \ArangoDBClient\TransactionBase::setWaitForSync() + + set waitForSync value - - string + + boolean - - \ArangoDBClient\DocumentClassable + + \ArangoDBClient\ClientException - $class + $value - string + boolean - \ArangoDBClient\DocumentClassable + \ArangoDBClient\TransactionBase - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use + + getWaitForSync + \ArangoDBClient\TransactionBase::getWaitForSync() + + get waitForSync value - - string + + boolean - - \ArangoDBClient\DocumentClassable + + \ArangoDBClient\TransactionBase + + + setLockTimeout + \ArangoDBClient\TransactionBase::setLockTimeout() + + Set lockTimeout value + + + integer + + + \ArangoDBClient\ClientException - $class + $value - string + integer - \ArangoDBClient\DocumentClassable + \ArangoDBClient\TransactionBase - - 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 - - - - ArangoDB PHP client: View class - - - - - - - - - View - \ArangoDBClient\View - - Value object representing a view - <br> - - - - - ENTRY_ID - \ArangoDBClient\View::ENTRY_ID - 'id' - - View id index + + getLockTimeout + \ArangoDBClient\TransactionBase::getLockTimeout() + + Get lockTimeout value + + integer + - - - ENTRY_NAME - \ArangoDBClient\View::ENTRY_NAME - 'name' - - View name index + \ArangoDBClient\TransactionBase + + + setReadCollections + \ArangoDBClient\TransactionBase::setReadCollections() + + Convenience function to directly set read-collections without having to access +them from the collections attribute. + + array + - - - ENTRY_TYPE - \ArangoDBClient\View::ENTRY_TYPE - 'type' - - View type index + + $value + + array + + \ArangoDBClient\TransactionBase + + + getReadCollections + \ArangoDBClient\TransactionBase::getReadCollections() + + Convenience function to directly get read-collections without having to access +them from the collections attribute. + + array + - - - $_id - \ArangoDBClient\View::_id - - - The view id (might be NULL for new views) + \ArangoDBClient\TransactionBase + + + setWriteCollections + \ArangoDBClient\TransactionBase::setWriteCollections() + + Convenience function to directly set write-collections without having to access +them from the collections attribute. - - string + + array - - - $_name - \ArangoDBClient\View::_name - - - The view name + + $value + + array + + \ArangoDBClient\TransactionBase + + + getWriteCollections + \ArangoDBClient\TransactionBase::getWriteCollections() + + Convenience function to directly get write-collections without having to access +them from the collections attribute. - - string + + array - - - __construct - \ArangoDBClient\View::__construct() - - Constructs an empty view + \ArangoDBClient\TransactionBase + + + setExclusiveCollections + \ArangoDBClient\TransactionBase::setExclusiveCollections() + + Convenience function to directly set exclusive-collections without having to access +them from the collections attribute. - + array - - string + + + $value + + array + + \ArangoDBClient\TransactionBase + + + getExclusiveCollections + \ArangoDBClient\TransactionBase::getExclusiveCollections() + + Convenience function to directly get exclusive-collections without having to access +them from the collections attribute. + + + array - - + + \ArangoDBClient\TransactionBase + + + set + \ArangoDBClient\TransactionBase::set() + + Sets an attribute + + + + \ArangoDBClient\ClientException - $name + $key - array + - $type + $value - string + + \ArangoDBClient\TransactionBase - - getId - \ArangoDBClient\View::getId() - - Return the view id - - - string + + __set + \ArangoDBClient\TransactionBase::__set() + + Set an attribute, magic method + This is a magic method that allows the object to be used without +declaring all document attributes first. + + \ArangoDBClient\ClientException - - - - setId - \ArangoDBClient\View::setId() - - Set the view's id - - + + string - + + mixed + + void - $id + $key - + string + + $value + + mixed + + \ArangoDBClient\TransactionBase - - getName - \ArangoDBClient\View::getName() - - Return the view name + + get + \ArangoDBClient\TransactionBase::get() + + Get an attribute - + string + + mixed + + + $key + + string + + \ArangoDBClient\TransactionBase - - getType - \ArangoDBClient\View::getType() - - Return the view type - - + + __get + \ArangoDBClient\TransactionBase::__get() + + Get an attribute, magic method + This function is mapped to get() internally. + + string + + mixed + + + $key + + string + + \ArangoDBClient\TransactionBase - - getAll - \ArangoDBClient\View::getAll() - - Return the view as an array + + __isset + \ArangoDBClient\TransactionBase::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. - - array + + string + + + boolean + + $key + + string + + \ArangoDBClient\TransactionBase - - eJyNlUmP2jAUgO/5Fe+AxCIo3Q4VDHQog2bRFKEZijQqFXISQ9wGJ7INM6jqf6+XJJCN4Esgb/ve5lx9Db3QsrqtlgUtGDFEN8HNN5jdzcDxCaaiBwuCX+UfxLlUUVrXIXL+oA0GSAzGWlcL0U54AZMyeEAUngXGW0SpFjlBeGBk4wkYJ78+vv/wpX0MfLu179pS7Acbittwi5m0PsSBOaGOCgvw6d1n+aZrWRRtMZdAOMPST5JaIH+HIbB/Y0cAwyHDXMoJ3QCCvcwtcn5ls+FFCeYhdHF0nay/lhLoyOq0YO5hHQWIC42tTtnGMP3x+AhrWSYqJUrMm5FBbHe9Rwy4YIqzE3uIhF39DFkgZErYhdqKuDLfssiqRNXeT7Ty/pWwr99moyyi3Ah18VvK3gkoFzCZzp9eVvc3MIA6cet5zEUcvMLFdPR9opwo1foZFnEIq1zNX2balVItcTVW6mznCA5yivE2FIdoWNJ1DBFDW0CMoQPUdBbmdExKqsUnZrF+VPmaZo309zF8NkRm3tJC4bHglcMyPadL85i8OTgUJKDpvu5snziw3lFHyWC1cuJkGzqFtgEzE2kGWp2a8AjvDPUsyOrVjjNxKtUpDYwHI/2Xa/kTFjtGQRxXI5sWMxrn5z+TxwaLe7fRhAx25CrmU5tiqIra/oxFglXnBWCp/mW5svj7oAKZa+QacXPUR1xVzPPQ2XIW7XthQfMrny/pVOpUFvU4CpcRFo15IeGJYinhXOpUEp6O4yWESO+93usSULPzEaeLBCqwKWUe+X4p8s/khToc++teL7lF4zMYxqlFY98utdIXZ4GV6Wy5nb4lC+xMvY92v+K6ykXXX8IV8gniDXUb93r6TRvqS9lX+UmlPL6q7KVSqDf71n+69j+0 - - - - ArangoDB PHP client: user document handler - - - - - - - \ArangoDBClient\Handler - UserHandler - \ArangoDBClient\UserHandler - - A handler that manages users - . -A user-document handler that fetches vertices from the server and -persists them on the server. It does so by issuing the -appropriate HTTP requests to the server. - - - - - - $_connection - \ArangoDBClient\Handler::_connection - - - Connection object + + buildTransactionAttributesFromArray + \ArangoDBClient\TransactionBase::buildTransactionAttributesFromArray() + + Build the object's attributes from a given array - - \ArangoDBClient\Connection + + + \ArangoDBClient\ClientException - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - - - - string + + $options + + + + \ArangoDBClient\TransactionBase + + + $collection + + + - The collections array that includes both read and write collection definitions + + + array + + + + array - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - - - + + $readCollection + + + - The read-collections array or string (if only one) + + + mixed + + + + mixed + + + + + $writeCollection + + + - The write-collections array or string (if only one) + + + mixed + + + + mixed + + + + + $action + + + - The action to pass to the server + + + string + + + string - - addUser - \ArangoDBClient\UserHandler::addUser() - - save a user to the user-collection - This will save the user to the users collection. It will additionally grant the user permissions -for the current database - -This will throw if the user cannot be saved - - \ArangoDBClient\Exception + + $waitForSync + + + - WaitForSync on the transaction + + + boolean - + + + boolean + + + + + $lockTimeout + + + - LockTimeout on the transaction + + + integer + + + + integer + + + + + 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 + + + + ArangoDB PHP client: streaming transaction + + + + + + + \ArangoDBClient\TransactionBase + StreamingTransaction + \ArangoDBClient\StreamingTransaction + + Streaming transaction object + + + + + + + ENTRY_ID + \ArangoDBClient\StreamingTransaction::ENTRY_ID + 'id' + + class constant for id values + + + + + ENTRY_COLLECTIONS + \ArangoDBClient\TransactionBase::ENTRY_COLLECTIONS + 'collections' + + Collections index + + + + + ENTRY_WAIT_FOR_SYNC + \ArangoDBClient\TransactionBase::ENTRY_WAIT_FOR_SYNC + 'waitForSync' + + WaitForSync index + + + + + ENTRY_LOCK_TIMEOUT + \ArangoDBClient\TransactionBase::ENTRY_LOCK_TIMEOUT + 'lockTimeout' + + Lock timeout index + + + + + ENTRY_READ + \ArangoDBClient\TransactionBase::ENTRY_READ + 'read' + + Read index + + + + + ENTRY_WRITE + \ArangoDBClient\TransactionBase::ENTRY_WRITE + 'write' + + WRITE index + + + + + ENTRY_EXCLUSIVE + \ArangoDBClient\TransactionBase::ENTRY_EXCLUSIVE + 'exclusive' + + EXCLUSIVE index + + + + + $_id + \ArangoDBClient\StreamingTransaction::_id + + + The transaction id - assigned by the server + + string - - mixed + + + + $_collections + \ArangoDBClient\StreamingTransaction::_collections + + + An array of collections used by this transaction + + + array - - mixed + + + + $_connection + \ArangoDBClient\TransactionBase::_connection + + + The connection object + + + \ArangoDBClient\Connection - + + + + $attributes + \ArangoDBClient\TransactionBase::attributes + array() + + The transaction's attributes. + + array - - boolean + + + + __construct + \ArangoDBClient\StreamingTransaction::__construct() + + Constructs a streaming transaction object + + + \ArangoDBClient\Connection - + + array + + - $username + $connection - string - - - $passwd - null - mixed - - - $active - null - mixed + \ArangoDBClient\Connection - $extra + $transactionArray null array - - replaceUser - \ArangoDBClient\UserHandler::replaceUser() - - Replace an existing user, identified by its username - This will replace the user-document on the server - -This will throw if the document cannot be replaced - - \ArangoDBClient\Exception + + getCollection + \ArangoDBClient\StreamingTransaction::getCollection() + + Get a participating collection of the transaction by name +Will throw an exception if the collection is not part of the transaction + + + \ArangoDBClient\ClientException - + string - - mixed - - - mixed - - - array - - - boolean + + \ArangoDBClient\StreamingTransactionCollection - $username + $name string - - $passwd - null - mixed - - - $active - null - mixed - - - $extra - null - array - - - updateUser - \ArangoDBClient\UserHandler::updateUser() - - Update an existing user, identified by the username - This will update the user-document on the server - -This will throw if the document cannot be updated - - \ArangoDBClient\Exception - - + + getId + \ArangoDBClient\StreamingTransaction::getId() + + Get the transaction's id + + string - - mixed - - + + + + setId + \ArangoDBClient\StreamingTransaction::setId() + + Set the transaction's id - this is used internally and should not be called by end users + + mixed - - array - - - boolean - - $username + $id - string - - - $passwd - null - mixed - - - $active - null mixed - - $extra - null - array - - - get - \ArangoDBClient\UserHandler::get() - - Get a single user-document, identified by the username - This will throw if the document cannot be fetched from the server - - \ArangoDBClient\Exception + + query + \ArangoDBClient\StreamingTransaction::query() + + Executes an AQL query inside the transaction + This is a shortcut for creating a new Statement and executing it. + + \ArangoDBClient\ClientException - - string + + array - - \ArangoDBClient\User + + \ArangoDBClient\Cursor - $username + $data - string + array - - removeUser - \ArangoDBClient\UserHandler::removeUser() - - Remove a user, identified by the username + + buildTransactionAttributesFromArray + \ArangoDBClient\StreamingTransaction::buildTransactionAttributesFromArray() + + Build the object's attributes from a given array - - \ArangoDBClient\Exception - - - string - - - boolean + + + \ArangoDBClient\ClientException + - $username + $options - string + - - grantPermissions - \ArangoDBClient\UserHandler::grantPermissions() - - Grant R/W permissions to a user, for a specific database + + __construct + \ArangoDBClient\TransactionBase::__construct() + + Initialise the transaction object - - \ArangoDBClient\Exception - - - string - - - string + + \ArangoDBClient\Connection - - boolean + + \ArangoDBClient\ClientException - - $username - - string - - - $databaseName + $connection - string + \ArangoDBClient\Connection + \ArangoDBClient\TransactionBase - - grantDatabasePermissions - \ArangoDBClient\UserHandler::grantDatabasePermissions() - - Grant R/W permissions to a user, for a specific database + + getConnection + \ArangoDBClient\TransactionBase::getConnection() + + Return the connection object - - string - - - string - - - string + + \ArangoDBClient\Connection - - boolean + + \ArangoDBClient\TransactionBase + + + setCollections + \ArangoDBClient\TransactionBase::setCollections() + + Set the collections array. + The array should have 2 sub-arrays, namely 'read' and 'write' which should hold the respective collections +for the transaction + + array - $username - - string - - - $databaseName + $value - string - - - $permissions - 'rw' - string + array + \ArangoDBClient\TransactionBase - - revokePermissions - \ArangoDBClient\UserHandler::revokePermissions() - - Revoke R/W permissions for a user, for a specific database - - - \ArangoDBClient\Exception - - - string - - - string + + getCollections + \ArangoDBClient\TransactionBase::getCollections() + + Get collections array + This holds the read and write collections of the transaction + + array - + + \ArangoDBClient\TransactionBase + + + setWaitForSync + \ArangoDBClient\TransactionBase::setWaitForSync() + + set waitForSync value + + boolean - + + \ArangoDBClient\ClientException + - $username - - string - - - $databaseName + $value - string + boolean + \ArangoDBClient\TransactionBase - - revokeDatabasePermissions - \ArangoDBClient\UserHandler::revokeDatabasePermissions() - - Revoke R/W permissions for a user, for a specific database + + getWaitForSync + \ArangoDBClient\TransactionBase::getWaitForSync() + + get waitForSync value - - \ArangoDBClient\Exception - - - string + + boolean - - string + + \ArangoDBClient\TransactionBase + + + setLockTimeout + \ArangoDBClient\TransactionBase::setLockTimeout() + + Set lockTimeout value + + + integer - - boolean + + \ArangoDBClient\ClientException - $username - - string - - - $databaseName + $value - string + integer + \ArangoDBClient\TransactionBase - - grantCollectionPermissions - \ArangoDBClient\UserHandler::grantCollectionPermissions() - - Grant R/W permissions to a user, for a specific collection + + getLockTimeout + \ArangoDBClient\TransactionBase::getLockTimeout() + + Get lockTimeout value - - string - - - string - - - string - - - string + + integer - - boolean + + \ArangoDBClient\TransactionBase + + + setReadCollections + \ArangoDBClient\TransactionBase::setReadCollections() + + Convenience function to directly set read-collections without having to access +them from the collections attribute. + + + array - $username - - string - - - $databaseName - - string - - - $collectionName + $value - string - - - $permissions - 'rw' - string + array + \ArangoDBClient\TransactionBase - - revokeCollectionPermissions - \ArangoDBClient\UserHandler::revokeCollectionPermissions() - - Revoke R/W permissions for a user, for a specific database + + getReadCollections + \ArangoDBClient\TransactionBase::getReadCollections() + + Convenience function to directly get read-collections without having to access +them from the collections attribute. - - \ArangoDBClient\Exception - - - string - - - string - - - string + + array - - boolean + + \ArangoDBClient\TransactionBase + + + setWriteCollections + \ArangoDBClient\TransactionBase::setWriteCollections() + + Convenience function to directly set write-collections without having to access +them from the collections attribute. + + + array - $username - - string - - - $databaseName - - string - - - $collectionName + $value - string + array + \ArangoDBClient\TransactionBase - - getDatabases - \ArangoDBClient\UserHandler::getDatabases() - - Gets the list of databases a user has access to + + getWriteCollections + \ArangoDBClient\TransactionBase::getWriteCollections() + + Convenience function to directly get write-collections without having to access +them from the collections attribute. - - \ArangoDBClient\Exception - - - string + + array - + + \ArangoDBClient\TransactionBase + + + setExclusiveCollections + \ArangoDBClient\TransactionBase::setExclusiveCollections() + + Convenience function to directly set exclusive-collections without having to access +them from the collections attribute. + + array - $username + $value - string + array + \ArangoDBClient\TransactionBase - - getDatabasePermissionLevel - \ArangoDBClient\UserHandler::getDatabasePermissionLevel() - - Gets the list of collections a user has access to + + getExclusiveCollections + \ArangoDBClient\TransactionBase::getExclusiveCollections() + + Convenience function to directly get exclusive-collections without having to access +them from the collections attribute. - - string - - - string + + array - - string + + \ArangoDBClient\TransactionBase + + + set + \ArangoDBClient\TransactionBase::set() + + Sets an attribute + + + + + \ArangoDBClient\ClientException - $username + $key - string + - $databaseName + $value - string + + \ArangoDBClient\TransactionBase - - getCollectionPermissionLevel - \ArangoDBClient\UserHandler::getCollectionPermissionLevel() - - Gets the list of collections a user has access to - - - string + + __set + \ArangoDBClient\TransactionBase::__set() + + Set an attribute, magic method + This is a magic method that allows the object to be used without +declaring all document attributes first. + + \ArangoDBClient\ClientException - + + string - - string + + mixed - - string + + void - $username - - string - - - $databaseName + $key string - $collectionName + $value - string + mixed + \ArangoDBClient\TransactionBase - - __construct - \ArangoDBClient\Handler::__construct() - - Construct a new handler + + get + \ArangoDBClient\TransactionBase::get() + + Get an attribute - - \ArangoDBClient\Connection + + string + + + mixed - $connection + $key - \ArangoDBClient\Connection + string - \ArangoDBClient\Handler + \ArangoDBClient\TransactionBase - - getConnection - \ArangoDBClient\Handler::getConnection() - - Return the connection object - - - \ArangoDBClient\Connection + + __get + \ArangoDBClient\TransactionBase::__get() + + Get an attribute, magic method + This function is mapped to get() internally. + + + string + + + mixed - \ArangoDBClient\Handler + + $key + + string + + \ArangoDBClient\TransactionBase - - getConnectionOption - \ArangoDBClient\Handler::getConnectionOption() - - Return a connection option -This is a convenience function that calls json_encode_wrapper on the connection + + __isset + \ArangoDBClient\TransactionBase::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. - - - mixed + + string - - \ArangoDBClient\ClientException + + boolean - $optionName + $key - + string - \ArangoDBClient\Handler + \ArangoDBClient\TransactionBase - - json_encode_wrapper - \ArangoDBClient\Handler::json_encode_wrapper() - - Return a json encoded string for the array passed. - This is a convenience function that calls json_encode_wrapper on the connection - - array - - - string - - + + buildTransactionAttributesFromArray + \ArangoDBClient\TransactionBase::buildTransactionAttributesFromArray() + + Build the object's attributes from a given array + + + \ArangoDBClient\ClientException - $body + $options - array + - \ArangoDBClient\Handler + \ArangoDBClient\TransactionBase - - includeOptionsInBody - \ArangoDBClient\Handler::includeOptionsInBody() - - Helper function that runs through the options given and includes them into the parameters array given. - Only options that are set in $includeArray will be included. -This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - - array - - - array - - - array + + eJzVWNtuGzcQfddXTAABkgw5bhv0Ra7TyLLqKDBysdSmhW0I1IqS2K64G5JrW2jy753h3rjUrpI2yEOFAJaW5OGZw8OZ2fz0c7yJW62To6MWHMFQMbmOLs7h7cu3EISCSzMAbRRnWyHXYHBYs8CISOJsWvAiZsFfbM0BirUju8wOssRsIoVj8IpJmBrOt0xKOxRE8U6J9cbAqPj2w3ffP+vjJgIBpYbL7eJlH4fDaC15Hy65wtU7XH3Sakm25Rr35t62p0Uo0zrWEC3+5IHxyddQ10IGFNWzpz/aHYOQaV2CzhxM/mi4XGpwnp0zzVt/tyhyS4c+R5BiBJHUhkkDK5RGLOGehQnX2ZwT+9dOgfHr2fUf88kFnEFHLDsYmoc32/BKcAh2DLiFQL2WsNiBwQmaq3uusiX5yhf3TNG5kjzHHkaFSazEPTMc2nOx3CcwlMCUYjuIVsg5DLnF0JDofH+hq6bZZ5ECHDvrs0NyYXgNik/QIbDPdESKqoRQWb2hC2tUKcZMsS0tlxm5dlB+B+JtPQPlU29pGl/b2Wlon9BR2S8Pwmwa1DsQdrIIRQCrRKZM5vMgj7BbT7bfyOQMZBKGPYubetbuwBTd/oGL7MD1Mo3pI1bQFXpu8bt7+L2eg0qfNtni+PkiEeHSuTNDg35cJIbrX1S0HTaAnRZQn0oCJydocwNJTKyNCETMDB2vo2rL2921Cypwc1cC473kLNhAN5vKCmI3moerwSC9mKM3V1fj0Wzy5vX0rjIw/n109et08tv4Di8jtClVNUjgkrixE+/oNPhDbaIZFZNTZv0Uuw+1m9cr9bWxvb+ezA7ERU54IjQeRrc5xD1DfFtFLGVHjVSRb6DN9Xh48f+ShhgfUCbTx8+ll3jVWONNo1rgZS5KZrR5DvBehCHOUdEDMCqfAY/T2pOudLCwfMjI2L1qcP1cbSE1pFV8nMPWZ/Ss+FlRMBXbP5G/v79UcZMo+Rm962rZwdy95sY9LWseLxn/F/OkApM/PEG6HYcsyav4WmjDFZYdIV2BO5Ukkn/LVGgmctoqF9SZxzvGji67Dl/qL+pR9vWcLLu+hB5ramcyf3sMpw0MiQT1MyKr0EKiZJKF4Q5dvAS9iZJwafVcoIfweVrFsTWk+UrX+3ArHnFeO4Wv9nKYSWSyXXAFUd6sHYxb27gRyg8dW0KuDJXoFMXOgY8fMZQ57sCVCOwjv6aXWsGTs6xL8PLTAZNNS0GSeEk9GqmKWHjN7LVHz3k9WKe+aGX9RYVqhQfJdwbdNLoe/XRwYK/029nt0gGFT30rjB95QPmf+A7fXcGHhKsdHrwWS/6ZZDTLrMLIGMogjO33A8wcNmqWZW7UZUv9I1mI2+1oVJinX5Pcsk4PRWdoq5Q1/eiTp5CU4h8SoVJ/FhSqrV6v4UKOEqUxjhw1sD8tbjphDzQNiheA9d61aF2Ht+9h+/Cm45qFyp890vKw27oQ9KwqcG5mm2zzJrbb62e7lRB5niiQjp8XITSljHNqZa0h0nSP+aJsHmCF7Sye91rc8+x9qf7U2lHstKp7J39bfUu9rXdC/lYUGeSBh1Eo/EXtdsag6V3gX2HsvSDY6pWNVhqnycV+45MdV5bTmlb55QmPBv/Z9+w5CwXTXYftYGAH+tC5zf+PIdd0cVtX0ykd/QNGwTZW + + + + ArangoDB PHP client: URL helper methods + + + + + + + + UrlHelper + \ArangoDBClient\UrlHelper + + Some helper methods to construct and process URLs + + + + + + getDocumentIdFromLocation + \ArangoDBClient\UrlHelper::getDocumentIdFromLocation() + + Get the document id from a location header + + + string - - array + + string - $options + $location - array + string + + + buildUrl + \ArangoDBClient\UrlHelper::buildUrl() + + Construct a URL from a base URL and additional parts, separated with '/' each + This function accepts variable arguments. + + string + + + array + + + string + + - $body + $baseUrl - array + string - $includeArray + $parts array() array - \ArangoDBClient\Handler - - makeCollection - \ArangoDBClient\Handler::makeCollection() - - Turn a value into a collection name - - - \ArangoDBClient\ClientException + + appendParamsUrl + \ArangoDBClient\UrlHelper::appendParamsUrl() + + Append parameters to a URL + Parameter values will be URL-encoded + + string - - mixed + + array - + string - $value + $baseUrl - mixed + string - \ArangoDBClient\Handler - - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use - - - string - - - \ArangoDBClient\DocumentClassable - - - $class + $params - string + array - \ArangoDBClient\DocumentClassable - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use + + getBoolString + \ArangoDBClient\UrlHelper::getBoolString() + + Get a string from a boolean value - - string + + mixed - - \ArangoDBClient\DocumentClassable + + string - $class + $value - string + mixed - \ArangoDBClient\DocumentClassable - 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 - + - ArangoDB PHP client: single document + ArangoDB PHP client: endpoint - - + - \JsonSerializable - Document - \ArangoDBClient\Document - - Value object representing a single collection-based document - <br> - - + Endpoint + \ArangoDBClient\Endpoint + + Endpoint specification + An endpoint contains the server location the client connects to +the following endpoint types are currently supported (more to be added later): +<ul> +<li> tcp://host:port for tcp connections +<li> unix://socket for UNIX sockets (provided the server supports this) +<li> ssl://host:port for SSL connections (provided the server supports this) +</ul> + +Note: SSL support is added in ArangoDB server 1.1<br> + +<br> + + - - ENTRY_ID - \ArangoDBClient\Document::ENTRY_ID - '_id' - - Document id index + + TYPE_TCP + \ArangoDBClient\Endpoint::TYPE_TCP + 'tcp' + + TCP endpoint type - - ENTRY_KEY - \ArangoDBClient\Document::ENTRY_KEY - '_key' - - Document key index + + TYPE_SSL + \ArangoDBClient\Endpoint::TYPE_SSL + 'ssl' + + SSL endpoint type - - ENTRY_REV - \ArangoDBClient\Document::ENTRY_REV - '_rev' - - Revision id index + + TYPE_UNIX + \ArangoDBClient\Endpoint::TYPE_UNIX + 'unix' + + UNIX socket endpoint type - - ENTRY_ISNEW - \ArangoDBClient\Document::ENTRY_ISNEW - '_isNew' - - isNew id index + + REGEXP_TCP + \ArangoDBClient\Endpoint::REGEXP_TCP + '/^(tcp|http):\/\/(.+?):(\d+)\/?$/' + + Regexp for TCP endpoints - - ENTRY_HIDDENATTRIBUTES - \ArangoDBClient\Document::ENTRY_HIDDENATTRIBUTES - '_hiddenAttributes' - - hidden attribute index + + REGEXP_SSL + \ArangoDBClient\Endpoint::REGEXP_SSL + '/^(ssl|https):\/\/(.+?):(\d+)\/?$/' + + Regexp for SSL endpoints - - ENTRY_IGNOREHIDDENATTRIBUTES - \ArangoDBClient\Document::ENTRY_IGNOREHIDDENATTRIBUTES - '_ignoreHiddenAttributes' - - hidden attribute index + + REGEXP_UNIX + \ArangoDBClient\Endpoint::REGEXP_UNIX + '/^unix:\/\/(.+)$/' + + Regexp for UNIX socket endpoints - - OPTION_WAIT_FOR_SYNC - \ArangoDBClient\Document::OPTION_WAIT_FOR_SYNC - 'waitForSync' - - waitForSync option index + + ENTRY_ENDPOINT + \ArangoDBClient\Endpoint::ENTRY_ENDPOINT + 'endpoint' + + Endpoint index - - OPTION_POLICY - \ArangoDBClient\Document::OPTION_POLICY - 'policy' - - policy option index - - - - - OPTION_KEEPNULL - \ArangoDBClient\Document::OPTION_KEEPNULL - 'keepNull' - - keepNull option index + + ENTRY_DATABASES + \ArangoDBClient\Endpoint::ENTRY_DATABASES + 'databases' + + Databases index - - $_id - \ArangoDBClient\Document::_id - - - The document id (might be NULL for new documents) - - - string - - - - - $_key - \ArangoDBClient\Document::_key + + $_value + \ArangoDBClient\Endpoint::_value - - The document key (might be NULL for new documents) + + Current endpoint value - + string - - $_rev - \ArangoDBClient\Document::_rev - - - The document revision (might be NULL for new documents) - - - mixed - - - - - $_values - \ArangoDBClient\Document::_values - array() - - The document attributes (names/values) - - - array - - - - - $_changed - \ArangoDBClient\Document::_changed - false - - Flag to indicate whether document was changed locally - - - boolean - - - - - $_isNew - \ArangoDBClient\Document::_isNew - true - - Flag to indicate whether document is a new document (never been saved to the server) - - - boolean - - - - - $_doValidate - \ArangoDBClient\Document::_doValidate - false - - Flag to indicate whether validation of document values should be performed -This can be turned on, but has a performance penalty - - - boolean - - - - - $_hiddenAttributes - \ArangoDBClient\Document::_hiddenAttributes - array() - - An array, that defines which attributes should be treated as hidden. - - - array - - - - - $_ignoreHiddenAttributes - \ArangoDBClient\Document::_ignoreHiddenAttributes - false - - Flag to indicate whether hidden attributes should be ignored or included in returned data-sets - - - boolean - - - - + __construct - \ArangoDBClient\Document::__construct() - - Constructs an empty document + \ArangoDBClient\Endpoint::__construct() + + Create a new endpoint - - array + + string - - - $options - null - array - - - - createFromArray - \ArangoDBClient\Document::createFromArray() - - Factory method to construct a new document using the values passed to populate it - - + \ArangoDBClient\ClientException - - array - - - array - - - \ArangoDBClient\Document - \ArangoDBClient\Edge - \ArangoDBClient\Graph - - $values + $value - array - - - $options - array() - array + string - - __clone - \ArangoDBClient\Document::__clone() - - Clone a document - Returns the clone - - - void - - - - + __toString - \ArangoDBClient\Document::__toString() - - Get a string representation of the document. - It will not output hidden attributes. - -Returns the document as JSON-encoded string - - + \ArangoDBClient\Endpoint::__toString() + + Return a string representation of the endpoint + + + string - - toJson - \ArangoDBClient\Document::toJson() - - Returns the document as JSON-encoded string + + getType + \ArangoDBClient\Endpoint::getType() + + Return the type of an endpoint - - array + + string - + string - $options - array() - array + $value + + string - - toSerialized - \ArangoDBClient\Document::toSerialized() - - Returns the document as a serialized string + + normalize + \ArangoDBClient\Endpoint::normalize() + + Return normalize an endpoint string - will convert http: into tcp:, and https: into ssl: - - array + + string - + string - $options - array() - array + $value + + string - - filterHiddenAttributes - \ArangoDBClient\Document::filterHiddenAttributes() - - Returns the attributes with the hidden ones removed + + getHost + \ArangoDBClient\Endpoint::getHost() + + Return the host name of an endpoint - - array - - - array + + string - - array + + string - $attributes + $value - array - - - $_hiddenAttributes - array() - array + string - - set - \ArangoDBClient\Document::set() - - Set a document attribute - The key (attribute name) must be a string. -This will validate the value of the attribute and might throw an -exception if the value is invalid. - - \ArangoDBClient\ClientException - - + + isValid + \ArangoDBClient\Endpoint::isValid() + + check whether an endpoint specification is valid + + string - - mixed - - - void + + boolean - - $key - - string - $value - mixed + - - __set - \ArangoDBClient\Document::__set() - - Set a document attribute, magic method - This is a magic method that allows the object to be used without -declaring all document attributes first. -This function is mapped to set() internally. - - \ArangoDBClient\ClientException - - - - string + + listEndpoints + \ArangoDBClient\Endpoint::listEndpoints() + + List endpoints + This will list the endpoints that are configured on the server + + \ArangoDBClient\Connection - - mixed + + + array - - void + + \ArangoDBClient\Exception - $key - - string - - - $value + $connection - mixed + \ArangoDBClient\Connection - - get - \ArangoDBClient\Document::get() - - Get a document attribute + + normalizeHostname + \ArangoDBClient\Endpoint::normalizeHostname() + + Replaces "localhost" in hostname with "[::1]" in order to make these values the same +for later comparisons - + string - - mixed - - - - $key - - string - - - - __get - \ArangoDBClient\Document::__get() - - Get a document attribute, magic method - This function is mapped to get() internally. - - + string - - mixed - - $key + $hostname string - - __isset - \ArangoDBClient\Document::__isset() - - Is triggered by calling isset() or empty() on inaccessible properties. + + + Name of argument $value does not match with the DocBlock's name $mixed in isValid() + Parameter $mixed could not be found in isValid() + + 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 + + + + ArangoDB PHP client: batch + + + + + + + + Batch + \ArangoDBClient\Batch + + Provides batching functionality + + + + + + $_batchResponse + \ArangoDBClient\Batch::_batchResponse + + + Batch Response Object - - string - - - boolean + + \ArangoDBClient\HttpResponse - - $key - - string - - - - __unset - \ArangoDBClient\Document::__unset() - - Magic method to unset an attribute. - Caution!!! This works only on the first array level. -The preferred method to unset attributes in the database, is to set those to null and do an update() with the option: 'keepNull' => false. - - - - - $key - - - - - - getAll - \ArangoDBClient\Document::getAll() - - Get all document attributes + + + $_processed + \ArangoDBClient\Batch::_processed + false + + Flag that signals if this batch was processed or not. Processed => true ,or not processed => false - - mixed - - - array + + boolean - - $options - array() - mixed - - - - getAllForInsertUpdate - \ArangoDBClient\Document::getAllForInsertUpdate() - - Get all document attributes for insertion/update + + + $_batchParts + \ArangoDBClient\Batch::_batchParts + array() + + The array of BatchPart objects - - mixed + + array - - - getAllAsObject - \ArangoDBClient\Document::getAllAsObject() - - Get all document attributes, and return an empty object if the documentapped into a DocumentWrapper class + + + $_nextBatchPartId + \ArangoDBClient\Batch::_nextBatchPartId + + + The next batch part id - - mixed - - - mixed + + integer + string - - $options - array() - mixed - - - - setHiddenAttributes - \ArangoDBClient\Document::setHiddenAttributes() - - Set the hidden attributes -$cursor + + + $_batchPartCursorOptions + \ArangoDBClient\Batch::_batchPartCursorOptions + array() + + An array of BatchPartCursor options - + array - - void - - - $attributes - - array - - - - getHiddenAttributes - \ArangoDBClient\Document::getHiddenAttributes() - - Get the hidden attributes + + + $_connection + \ArangoDBClient\Batch::_connection + + + The connection object - - array + + \ArangoDBClient\Connection - - - isIgnoreHiddenAttributes - \ArangoDBClient\Document::isIgnoreHiddenAttributes() - - + + + $_sanitize + \ArangoDBClient\Batch::_sanitize + false + + The sanitize default value - + boolean - - - setIgnoreHiddenAttributes - \ArangoDBClient\Document::setIgnoreHiddenAttributes() - - - - - boolean + + + $_nextId + \ArangoDBClient\Batch::_nextId + 0 + + The Batch NextId + + + integer + string - - $ignoreHiddenAttributes - - boolean - - - - setChanged - \ArangoDBClient\Document::setChanged() - - Set the changed flag + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + - - boolean - - - boolean + + string - - $value - - boolean - - - - getChanged - \ArangoDBClient\Document::getChanged() - - Get the changed flag + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + - - boolean + + string - - - setIsNew - \ArangoDBClient\Document::setIsNew() - - Set the isNew flag - - - boolean + + + __construct + \ArangoDBClient\Batch::__construct() + + Constructor for Batch instance. Batch instance by default starts capturing request after initiated. + To disable this, pass startCapture=>false inside the options array parameter + + \ArangoDBClient\Connection - - void + + array - $isNew + $connection - boolean + \ArangoDBClient\Connection - - - getIsNew - \ArangoDBClient\Document::getIsNew() - - Get the isNew flag - - - boolean - - - - - setInternalId - \ArangoDBClient\Document::setInternalId() - - Set the internal document id - This will throw if the id of an existing document gets updated to some other id - - \ArangoDBClient\ClientException - - - string - - - void - - - $id - - string + $options + array() + array - - setInternalKey - \ArangoDBClient\Document::setInternalKey() - - Set the internal document key - This will throw if the key of an existing document gets updated to some other key - - \ArangoDBClient\ClientException - - - string + + setConnection + \ArangoDBClient\Batch::setConnection() + + Sets the connection for he current batch. (mostly internal function) + + + \ArangoDBClient\Connection - - void + + \ArangoDBClient\Batch - $key + $connection - string + \ArangoDBClient\Connection - - getInternalId - \ArangoDBClient\Document::getInternalId() - - Get the internal document id (if already known) - Document ids are generated on the server only. Document ids consist of collection id and -document id, in the format collectionId/documentId - - string + + startCapture + \ArangoDBClient\Batch::startCapture() + + Start capturing requests. To stop capturing, use stopCapture() + see ArangoDBClient\Batch::stopCapture() + + \ArangoDBClient\Batch - - getInternalKey - \ArangoDBClient\Document::getInternalKey() - - Get the internal document key (if already known) - - - string + + stopCapture + \ArangoDBClient\Batch::stopCapture() + + Stop capturing requests. If the batch has not been processed yet, more requests can be appended by calling startCapture() again. + see Batch::startCapture() + + \ArangoDBClient\ClientException + + + \ArangoDBClient\Batch - - getHandle - \ArangoDBClient\Document::getHandle() - - Convenience function to get the document handle (if already known) - is an alias to getInternalId() - Document handles are generated on the server only. Document handles consist of collection id and -document id, in the format collectionId/documentId - - string + + isActive + \ArangoDBClient\Batch::isActive() + + Returns true, if this batch is active in its associated connection. + + + boolean - - getId - \ArangoDBClient\Document::getId() - - Get the document id (or document handle) if already known. - It is a string and consists of the collection's name and the document key (_key attribute) separated by /. -Example: (collectionname/documentId) - -The document handle is stored in a document's _id attribute. - - mixed + + isCapturing + \ArangoDBClient\Batch::isCapturing() + + Returns true, if this batch is capturing requests. + + + boolean - - getKey - \ArangoDBClient\Document::getKey() - - Get the document key (if already known). - Alias function for getInternalKey() - - mixed + + activate + \ArangoDBClient\Batch::activate() + + Activates the batch. This sets the batch active in its associated connection and also starts capturing. + + + \ArangoDBClient\Batch - - getCollectionId - \ArangoDBClient\Document::getCollectionId() - - Get the collection id (if already known) - Collection ids are generated on the server only. Collection ids are numeric but might be -bigger than PHP_INT_MAX. To reliably store a collection id elsewhere, a PHP string should be used - - mixed + + setActive + \ArangoDBClient\Batch::setActive() + + Sets the batch active in its associated connection. + + + \ArangoDBClient\Batch - - setRevision - \ArangoDBClient\Document::setRevision() - - Set the document revision - Revision ids are generated on the server only. - -Document ids are strings, even if they look "numeric" -To reliably store a document id elsewhere, a PHP string must be used - - mixed + + setCapture + \ArangoDBClient\Batch::setCapture() + + Sets the batch's associated connection into capture mode. + + + boolean - - void + + \ArangoDBClient\Batch - $rev + $state - mixed + boolean - - getRevision - \ArangoDBClient\Document::getRevision() - - Get the document revision (if already known) + + getActive + \ArangoDBClient\Batch::getActive() + + Gets active batch in given connection. - - mixed + + \ArangoDBClient\Connection + + \ArangoDBClient\Batch + + + + $connection + + \ArangoDBClient\Connection + - - jsonSerialize - \ArangoDBClient\Document::jsonSerialize() - - Get all document attributes -Alias function for getAll() - it's necessary for implementing JsonSerializable interface + + getConnectionCaptureMode + \ArangoDBClient\Batch::getConnectionCaptureMode() + + Returns true, if given connection is in batch-capture mode. - - mixed + + \ArangoDBClient\Connection - - array + + boolean - $options - array() - mixed + $connection + + \ArangoDBClient\Connection - - - No summary for method isIgnoreHiddenAttributes() - No summary for method setIgnoreHiddenAttributes() - - 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 - - - - ArangoDB PHP client: connection options - - - - - - - - \ArrayAccess - ConnectionOptions - \ArangoDBClient\ConnectionOptions - - Simple container class for connection options. - This class also provides the default values for the connection -options and will perform a simple validation of them.<br> -It provides array access to its members.<br> -<br> - - - - - OPTION_ENDPOINT - \ArangoDBClient\ConnectionOptions::OPTION_ENDPOINT - 'endpoint' - - Endpoint string index constant + + setBatchRequest + \ArangoDBClient\Batch::setBatchRequest() + + Sets connection into Batch-Request mode. This is necessary to distinguish between normal and the batch request. + + boolean + + + \ArangoDBClient\Batch + + - - - OPTION_HOST - \ArangoDBClient\ConnectionOptions::OPTION_HOST - 'host' - - Host name string index constant (deprecated, use endpoint instead) + + $state + + boolean + + + + nextBatchPartId + \ArangoDBClient\Batch::nextBatchPartId() + + Sets the id of the next batch-part. The id can later be used to retrieve the batch-part. + + mixed + + + \ArangoDBClient\Batch + - - - OPTION_PORT - \ArangoDBClient\ConnectionOptions::OPTION_PORT - 'port' - - Port number index constant (deprecated, use endpoint instead) + + $batchPartId + + mixed + + + + nextBatchPartCursorOptions + \ArangoDBClient\Batch::nextBatchPartCursorOptions() + + Set client side cursor options (for example: sanitize) for the next batch part. + + mixed + + + \ArangoDBClient\Batch + - - - OPTION_TIMEOUT - \ArangoDBClient\ConnectionOptions::OPTION_TIMEOUT - 'timeout' - - Timeout value index constant + + $batchPartCursorOptions + + mixed + + + + append + \ArangoDBClient\Batch::append() + + Append the request to the batch-part + + mixed + + + mixed + + + \ArangoDBClient\HttpResponse + + + \ArangoDBClient\ClientException + - - - OPTION_FAILOVER_TRIES - \ArangoDBClient\ConnectionOptions::OPTION_FAILOVER_TRIES - 'failoverTries' - - Number of servers tried in case of failover -if set to 0, then an unlimited amount of servers will be tried + + $method + + mixed + + + $request + + mixed + + + + splitWithContentIdKey + \ArangoDBClient\Batch::splitWithContentIdKey() + + Split batch request and use ContentId as array key + + mixed + + + mixed + + + array + + + \ArangoDBClient\ClientException + - - - OPTION_FAILOVER_TIMEOUT - \ArangoDBClient\ConnectionOptions::OPTION_FAILOVER_TIMEOUT - 'failoverTimeout' - - Max amount of time (in seconds) that is spent waiting on failover + + $pattern + + mixed + + + $string + + mixed + + + + process + \ArangoDBClient\Batch::process() + + Processes this batch. This sends the captured requests to the server as one batch. + + \ArangoDBClient\HttpResponse + \ArangoDBClient\Batch + + + \ArangoDBClient\ClientException + + + \ArangoDBClient\Exception + - - - OPTION_TRACE - \ArangoDBClient\ConnectionOptions::OPTION_TRACE - 'trace' - - Trace function index constant + + + countParts + \ArangoDBClient\Batch::countParts() + + Get the total count of the batch parts + + integer + - - - OPTION_VERIFY_CERT - \ArangoDBClient\ConnectionOptions::OPTION_VERIFY_CERT - 'verifyCert' - - "verify certificates" index constant - + + + getPart + \ArangoDBClient\Batch::getPart() + + Get the batch part identified by the array key (0. + ..n) or its id (if it was set with nextBatchPartId($id) ) + + mixed + + + mixed + + + \ArangoDBClient\ClientException + - - - OPTION_VERIFY_CERT_NAME - \ArangoDBClient\ConnectionOptions::OPTION_VERIFY_CERT_NAME - 'verifyCertName' - - "verify certificate host name" index constant - + + $partId + + mixed + + + + getPartResponse + \ArangoDBClient\Batch::getPartResponse() + + Get the batch part identified by the array key (0. + ..n) or its id (if it was set with nextBatchPartId($id) ) + + mixed + + + mixed + + + \ArangoDBClient\ClientException + - - - OPTION_ALLOW_SELF_SIGNED - \ArangoDBClient\ConnectionOptions::OPTION_ALLOW_SELF_SIGNED - 'allowSelfSigned' - - "allow self-signed" index constant - + + $partId + + mixed + + + + getProcessedPartResponse + \ArangoDBClient\Batch::getProcessedPartResponse() + + Get the batch part identified by the array key (0. + ..n) or its id (if it was set with nextBatchPartId($id) ) + + mixed + + + mixed + + + \ArangoDBClient\ClientException + - - - OPTION_CIPHERS - \ArangoDBClient\ConnectionOptions::OPTION_CIPHERS - 'ciphers' - - ciphers allowed to be used in SSL + + $partId + + mixed + + + + getBatchParts + \ArangoDBClient\Batch::getBatchParts() + + Returns the array of batch-parts + + array + - - - OPTION_ENHANCED_TRACE - \ArangoDBClient\ConnectionOptions::OPTION_ENHANCED_TRACE - 'enhancedTrace' - - Enhanced trace + + + getCursorOptions + \ArangoDBClient\Batch::getCursorOptions() + + Return an array of cursor options + + array + - - - OPTION_CREATE - \ArangoDBClient\ConnectionOptions::OPTION_CREATE - 'createCollection' - - "Create collections if they don't exist" index constant + + + getConnection + \ArangoDBClient\Batch::getConnection() + + Return this batch's connection + + \ArangoDBClient\Connection + - - - OPTION_REVISION - \ArangoDBClient\ConnectionOptions::OPTION_REVISION - 'rev' - - Update revision constant + + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use + + string + + + \ArangoDBClient\DocumentClassable + - - - OPTION_UPDATE_POLICY - \ArangoDBClient\ConnectionOptions::OPTION_UPDATE_POLICY - 'policy' - - Update policy index constant + + $class + + string + + \ArangoDBClient\DocumentClassable + + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use + + string + + + \ArangoDBClient\DocumentClassable + - - - OPTION_UPDATE_KEEPNULL - \ArangoDBClient\ConnectionOptions::OPTION_UPDATE_KEEPNULL - 'keepNull' - - Update keepNull constant + + $class + + string + + \ArangoDBClient\DocumentClassable + + + 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 + + + + ArangoDB PHP client: result set cursor for exports + + + + + + + + ExportCursor + \ArangoDBClient\ExportCursor + + Provides access to the results of a collection export + The cursor might not contain all results in the beginning.<br> + +If the result set is too big to be transferred in one go, the +cursor might issue additional HTTP requests to fetch the +remaining results from the server. + + + + + ENTRY_ID + \ArangoDBClient\ExportCursor::ENTRY_ID + 'id' + + result entry for cursor id - - OPTION_REPLACE_POLICY - \ArangoDBClient\ConnectionOptions::OPTION_REPLACE_POLICY - 'policy' - - Replace policy index constant + + ENTRY_HASMORE + \ArangoDBClient\ExportCursor::ENTRY_HASMORE + 'hasMore' + + result entry for "hasMore" flag - - OPTION_DELETE_POLICY - \ArangoDBClient\ConnectionOptions::OPTION_DELETE_POLICY - 'policy' - - Delete policy index constant + + ENTRY_RESULT + \ArangoDBClient\ExportCursor::ENTRY_RESULT + 'result' + + result entry for result documents - - OPTION_WAIT_SYNC - \ArangoDBClient\ConnectionOptions::OPTION_WAIT_SYNC - 'waitForSync' - - Wait for sync index constant + + ENTRY_FLAT + \ArangoDBClient\ExportCursor::ENTRY_FLAT + '_flat' + + "flat" option entry (will treat the results as a simple array, not documents) - - OPTION_LIMIT - \ArangoDBClient\ConnectionOptions::OPTION_LIMIT - 'limit' - - Limit index constant + + ENTRY_COUNT + \ArangoDBClient\ExportCursor::ENTRY_COUNT + 'count' + + result entry for document count - - OPTION_SKIP - \ArangoDBClient\ConnectionOptions::OPTION_SKIP - 'skip' - - Skip index constant + + ENTRY_TYPE + \ArangoDBClient\ExportCursor::ENTRY_TYPE + 'type' + + "type" option entry (is used when converting the result into documents or edges objects) - - OPTION_BATCHSIZE - \ArangoDBClient\ConnectionOptions::OPTION_BATCHSIZE - 'batchSize' - - Batch size index constant + + ENTRY_BASEURL + \ArangoDBClient\ExportCursor::ENTRY_BASEURL + 'baseurl' + + "baseurl" option entry. - - OPTION_JOURNAL_SIZE - \ArangoDBClient\ConnectionOptions::OPTION_JOURNAL_SIZE - 'journalSize' - - Wait for sync index constant + + $_connection + \ArangoDBClient\ExportCursor::_connection + + + The connection object + + \ArangoDBClient\Connection + - - - OPTION_IS_SYSTEM - \ArangoDBClient\ConnectionOptions::OPTION_IS_SYSTEM - 'isSystem' - - Wait for sync index constant + + + $_options + \ArangoDBClient\ExportCursor::_options + + + Cursor options + + array + - - - OPTION_IS_VOLATILE - \ArangoDBClient\ConnectionOptions::OPTION_IS_VOLATILE - 'isVolatile' - - Wait for sync index constant + + + $_result + \ArangoDBClient\ExportCursor::_result + + + The current result set + + array + - - - OPTION_AUTH_USER - \ArangoDBClient\ConnectionOptions::OPTION_AUTH_USER - 'AuthUser' - - Authentication user name + + + $_hasMore + \ArangoDBClient\ExportCursor::_hasMore + + + "has more" indicator - if true, the server has more results + + boolean + - - - OPTION_AUTH_PASSWD - \ArangoDBClient\ConnectionOptions::OPTION_AUTH_PASSWD - 'AuthPasswd' - - Authentication password + + + $_id + \ArangoDBClient\ExportCursor::_id + + + cursor id - might be NULL if cursor does not have an id + + mixed + - - - OPTION_AUTH_TYPE - \ArangoDBClient\ConnectionOptions::OPTION_AUTH_TYPE - 'AuthType' - - Authentication type + + + $_fetches + \ArangoDBClient\ExportCursor::_fetches + 1 + + number of HTTP calls that were made to build the cursor result - - - OPTION_CONNECTION - \ArangoDBClient\ConnectionOptions::OPTION_CONNECTION - 'Connection' - - Connection + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + + string + - - - OPTION_RECONNECT - \ArangoDBClient\ConnectionOptions::OPTION_RECONNECT - 'Reconnect' - - Reconnect flag + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + string + - - - OPTION_BATCH - \ArangoDBClient\ConnectionOptions::OPTION_BATCH - 'Batch' - - Batch flag + + + __construct + \ArangoDBClient\ExportCursor::__construct() + + Initialize the cursor with the first results and some metadata + + \ArangoDBClient\Connection + + + array + + + array + + + \ArangoDBClient\ClientException + - - - OPTION_BATCHPART - \ArangoDBClient\ConnectionOptions::OPTION_BATCHPART - 'BatchPart' - - Batchpart flag - + + $connection + + \ArangoDBClient\Connection + + + $data + + array + + + $options + + array + + + + delete + \ArangoDBClient\ExportCursor::delete() + + Explicitly delete the cursor + This might issue an HTTP DELETE request to inform the server about +the deletion. + + \ArangoDBClient\Exception + + + boolean + - - - OPTION_DATABASE - \ArangoDBClient\ConnectionOptions::OPTION_DATABASE - 'database' - - Database flag + + + getCount + \ArangoDBClient\ExportCursor::getCount() + + Get the total number of results in the export + + integer + - - - OPTION_CHECK_UTF8_CONFORM - \ArangoDBClient\ConnectionOptions::OPTION_CHECK_UTF8_CONFORM - 'CheckUtf8Conform' - - UTF-8 CHeck Flag - + + + getNextBatch + \ArangoDBClient\ExportCursor::getNextBatch() + + Get next results as an array + This might issue additional HTTP requests to fetch any outstanding +results from the server + + \ArangoDBClient\Exception + + + mixed + - - - OPTION_MEMCACHED_SERVERS - \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_SERVERS - 'memcachedServers' - - Entry for memcached servers array + + + setData + \ArangoDBClient\ExportCursor::setData() + + Create an array of results from the input array - - - - OPTION_MEMCACHED_OPTIONS - \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_OPTIONS - 'memcachedOptions' - - Entry for memcached options array - - - - - OPTION_MEMCACHED_ENDPOINTS_KEY - \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_ENDPOINTS_KEY - 'memcachedEndpointsKey' - - Entry for memcached endpoints key - - - - - OPTION_MEMCACHED_PERSISTENT_ID - \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_PERSISTENT_ID - 'memcachedPersistentId' - - Entry for memcached persistend id - - - - - OPTION_MEMCACHED_TTL - \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_TTL - 'memcachedTtl' - - Entry for memcached cache ttl - - - - - OPTION_NOTIFY_CALLBACK - \ArangoDBClient\ConnectionOptions::OPTION_NOTIFY_CALLBACK - 'notifyCallback' - - Entry for notification callback - - - - - $_values - \ArangoDBClient\ConnectionOptions::_values - array() - - The current options - - + array - - - - $_currentEndpointIndex - \ArangoDBClient\ConnectionOptions::_currentEndpointIndex - 0 - - The index into the endpoints array that we will connect to (or are currently -connected to). This index will be increased in case the currently connected -server tells us there is a different leader. We will then simply connect -to the new leader, adjusting this index. If we don't know the new leader -we will try the next server from the list of endpoints until we find the leader -or have tried to often - - - integer - - - - - $_cache - \ArangoDBClient\ConnectionOptions::_cache - null - - Optional Memcached instance for endpoints caching - - - \ArangoDBClient\Memcached - - - - - __construct - \ArangoDBClient\ConnectionOptions::__construct() - - Set defaults, use options provided by client and validate them - - - array + + void - + \ArangoDBClient\ClientException - $options + $data array - - getAll - \ArangoDBClient\ConnectionOptions::getAll() - - Get all options + + fetchOutstanding + \ArangoDBClient\ExportCursor::fetchOutstanding() + + Fetch outstanding results from the server - - array + + \ArangoDBClient\Exception + + + void - - offsetSet - \ArangoDBClient\ConnectionOptions::offsetSet() - - Set and validate a specific option, necessary for ArrayAccess + + url + \ArangoDBClient\ExportCursor::url() + + Return the base URL for the cursor - - \ArangoDBClient\Exception - - + string - - mixed - - - void + + + + getFetches + \ArangoDBClient\ExportCursor::getFetches() + + Return the number of HTTP calls that were made to build the cursor result + + + integer - - $offset - - string - - - $value - - mixed - - - offsetExists - \ArangoDBClient\ConnectionOptions::offsetExists() - - Check whether an option exists, necessary for ArrayAccess + + getId + \ArangoDBClient\ExportCursor::getId() + + Return the cursor id, if any - + string - - boolean - - - $offset - - string - - - offsetUnset - \ArangoDBClient\ConnectionOptions::offsetUnset() - - Remove an option and validate, necessary for ArrayAccess + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use - - \ArangoDBClient\Exception - - + string - - void + + \ArangoDBClient\DocumentClassable - $offset + $class string + \ArangoDBClient\DocumentClassable - - offsetGet - \ArangoDBClient\ConnectionOptions::offsetGet() - - Get a specific option, necessary for ArrayAccess + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use - - \ArangoDBClient\ClientException - - + string - - mixed + + \ArangoDBClient\DocumentClassable - $offset + $class string + \ArangoDBClient\DocumentClassable - - getCurrentEndpoint - \ArangoDBClient\ConnectionOptions::getCurrentEndpoint() - - Get the current endpoint to use + + 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 + + + + ArangoDB PHP client: failover exception + + + + + + + \ArangoDBClient\Exception + FailoverException + \ArangoDBClient\FailoverException + + Failover-Exception + This exception type will be thrown internally when a failover happens + + + + + + $_leader + \ArangoDBClient\FailoverException::_leader + + + New leader endpoint - + string - - - haveMultipleEndpoints - \ArangoDBClient\ConnectionOptions::haveMultipleEndpoints() - - Whether or not we have multiple endpoints to connect to + + + $enableLogging + \ArangoDBClient\Exception::enableLogging + false + + - - boolean + + + + __toString + \ArangoDBClient\FailoverException::__toString() + + Return a string representation of the exception + + + string - - addEndpoint - \ArangoDBClient\ConnectionOptions::addEndpoint() - - Add a new endpoint to the list of endpoints -if the endpoint is already in the list, it will not be added again -as a side-effect, this method will modify _currentEndpointIndex + + setLeader + \ArangoDBClient\FailoverException::setLeader() + + Set the new leader endpoint - + string - + void - $endpoint + $leader - string + - - nextEndpoint - \ArangoDBClient\ConnectionOptions::nextEndpoint() - - Return the next endpoint from the list of endpoints -As a side-effect this function switches to a new endpoint + + getLeader + \ArangoDBClient\FailoverException::getLeader() + + Return the new leader endpoint - + string - - getDefaults - \ArangoDBClient\ConnectionOptions::getDefaults() - - Get the default values for the options + + __construct + \ArangoDBClient\Exception::__construct() + + Exception constructor. - - array + + string + + + integer + + + \Exception + + $message + '' + string + + + $code + 0 + integer + + + $previous + null + \Exception + + \ArangoDBClient\Exception - - getSupportedAuthTypes - \ArangoDBClient\ConnectionOptions::getSupportedAuthTypes() - - Return the supported authorization types + + enableLogging + \ArangoDBClient\Exception::enableLogging() + + Turn on exception logging - - array - + \ArangoDBClient\Exception - - getSupportedConnectionTypes - \ArangoDBClient\ConnectionOptions::getSupportedConnectionTypes() - - Return the supported connection types + + disableLogging + \ArangoDBClient\Exception::disableLogging() + + Turn off exception logging - - array - + \ArangoDBClient\Exception - - validate - \ArangoDBClient\ConnectionOptions::validate() - - Validate the options + + eJyVk99v2jAQx9/zV9wDEhRBWduXie5XR7dWVTVVyx6RoiMciTVztmwDRRX/ex0nDZCm05oXR7773n2+d/KnrzrXUTTq9yPow5VBztT1d3i4fYBUCmI3hgUKqdZkgB5T0k4o9qlF9jeN6V/MCKAWToImBHHlcmV8DO6QIXZES2QOoVTprRFZ7mBS/51/OPs42APcLGe3Ax+WKmMawA0Zr9569SiKGJdkfW9qtL2sffyskIc/Gsh/cmH3PsBtNcFGSAkzApcbtWEQ7MgwSrmFTU4MuB9AjloT26b9FvNWcFrM5eL0IjCnEq2tsWoqj+KI5xb2nE9RMbLgo/j68Is2IAnnxQJ4rpUoWoTQS4YHMbgE64zgrLochVMbsUZH0EnKCpfhttnhN7mVKYyWFcCQNmS9FQyMauFHQ4fbP+5uSnklHrZXOcZazaRIYbHiNHRIEqfioOqdhIRyCMVXFU+Syf1VHCcJnEJ3DF1/dJzf5fBLRu4+eOudlO52rR5jcsEFv2+a3s5/qirQtRLzf3q1NW+nrNh0XPmqNgafoXO4u130xvbeh1m7e1vSjn8w7vZNHeO/QHvs8AQSlAJt79VDGI9DeADdqSfzj4rttHpWs+mr7K5f9TMcvmlo + + + + ArangoDB PHP client: connect exception + + + + + + + \ArangoDBClient\Exception + ConnectException + \ArangoDBClient\ConnectException + + Connect-Exception + This exception type will be thrown by the client when there is an error +during connecting to the server.<br> +<br> + + + + + + $enableLogging + \ArangoDBClient\Exception::enableLogging + false + + - - \ArangoDBClient\ClientException - - - void + + + + __toString + \ArangoDBClient\ConnectException::__toString() + + Return a string representation of the exception + + + string - - loadOptionsFromCache - \ArangoDBClient\ConnectionOptions::loadOptionsFromCache() - - load and merge connection options from optional Memcached cache into -ihe current settings + + __construct + \ArangoDBClient\Exception::__construct() + + Exception constructor. - - void + + string + + + integer + + + \Exception + + $message + '' + string + + + $code + 0 + integer + + + $previous + null + \Exception + + \ArangoDBClient\Exception - - storeOptionsInCache - \ArangoDBClient\ConnectionOptions::storeOptionsInCache() - - store the updated options in the optional Memcached cache + + enableLogging + \ArangoDBClient\Exception::enableLogging() + + Turn on exception logging - - void - + \ArangoDBClient\Exception - - getEndpointsCache - \ArangoDBClient\ConnectionOptions::getEndpointsCache() - - Initialize and return a memcached cache instance, -if option "memcachedServers" is set + + disableLogging + \ArangoDBClient\Exception::disableLogging() + + Turn off exception logging - - \ArangoDBClient\Memcached - + \ArangoDBClient\Exception - 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 - + - ArangoDB PHP client: connection + ArangoDB PHP client: single collection - + - Connection - \ArangoDBClient\Connection - - Provides access to the ArangoDB server - As all access is done using HTTP, we do not need to establish a -persistent connection and keep its state.<br> -Instead, connections are established on the fly for each request -and are destroyed afterwards.<br> - - + Collection + \ArangoDBClient\Collection + + Value object representing a collection + <br> + + - - $_options - \ArangoDBClient\Connection::_options - - - Connection options + + ENTRY_ID + \ArangoDBClient\Collection::ENTRY_ID + 'id' + + Collection id index - - array - - - - $_httpHeader - \ArangoDBClient\Connection::_httpHeader - '' - - Pre-assembled HTTP headers string for connection -This is pre-calculated when connection options are set/changed, to avoid -calculation of the same HTTP header values in each request done via the -connection + + + ENTRY_NAME + \ArangoDBClient\Collection::ENTRY_NAME + 'name' + + Collection name index - - string - - - - $_baseUrl - \ArangoDBClient\Connection::_baseUrl - '' - - Pre-assembled base URL for the current database -This is pre-calculated when connection options are set/changed, to avoid -calculation of the same base URL in each request done via the -connection - - - string - + + + ENTRY_TYPE + \ArangoDBClient\Collection::ENTRY_TYPE + 'type' + + Collection type index + - - - $_handle - \ArangoDBClient\Connection::_handle - - - Connection handle, used in case of keep-alive + + + ENTRY_WAIT_SYNC + \ArangoDBClient\Collection::ENTRY_WAIT_SYNC + 'waitForSync' + + Collection 'waitForSync' index - - resource - - - - $_useKeepAlive - \ArangoDBClient\Connection::_useKeepAlive - - - Flag if keep-alive connections are used + + + ENTRY_JOURNAL_SIZE + \ArangoDBClient\Collection::ENTRY_JOURNAL_SIZE + 'journalSize' + + Collection 'journalSize' index - - boolean - - - - $_batches - \ArangoDBClient\Connection::_batches - array() - - Batches Array + + + ENTRY_STATUS + \ArangoDBClient\Collection::ENTRY_STATUS + 'status' + + Collection 'status' index - - array - - - - $_activeBatch - \ArangoDBClient\Connection::_activeBatch - - - $_activeBatch object + + + ENTRY_KEY_OPTIONS + \ArangoDBClient\Collection::ENTRY_KEY_OPTIONS + 'keyOptions' + + Collection 'keyOptions' index - - \ArangoDBClient\Batch - - - - $_captureBatch - \ArangoDBClient\Connection::_captureBatch - false - - $_captureBatch boolean + + + ENTRY_IS_SYSTEM + \ArangoDBClient\Collection::ENTRY_IS_SYSTEM + 'isSystem' + + Collection 'isSystem' index - - boolean - - - - $_batchRequest - \ArangoDBClient\Connection::_batchRequest - false - - $_batchRequest boolean + + + ENTRY_IS_VOLATILE + \ArangoDBClient\Collection::ENTRY_IS_VOLATILE + 'isVolatile' + + Collection 'isVolatile' index - - boolean - - - - $_database - \ArangoDBClient\Connection::_database - '' - - $_database string + + + ENTRY_DISTRIBUTE_SHARDS_LIKE + \ArangoDBClient\Collection::ENTRY_DISTRIBUTE_SHARDS_LIKE + 'distributeShardsLike' + + Collection 'distributeShardsLike' index - - string - - - - __construct - \ArangoDBClient\Connection::__construct() - - Set up the connection object, validate the options provided + + + ENTRY_NUMBER_OF_SHARDS + \ArangoDBClient\Collection::ENTRY_NUMBER_OF_SHARDS + 'numberOfShards' + + Collection 'numberOfShards' index - - \ArangoDBClient\Exception - - - array - - - $options - - array - - - - __destruct - \ArangoDBClient\Connection::__destruct() - - Close existing connection handle if a keep-alive connection was used + + + ENTRY_REPLICATION_FACTOR + \ArangoDBClient\Collection::ENTRY_REPLICATION_FACTOR + 'replicationFactor' + + Collection 'replicationFactor' index - - void - - - - setOption - \ArangoDBClient\Connection::setOption() - - Set an option set for the connection + + + ENTRY_MIN_REPLICATION_FACTOR + \ArangoDBClient\Collection::ENTRY_MIN_REPLICATION_FACTOR + 'minReplicationFactor' + + Collection 'minReplicationFactor' index - - \ArangoDBClient\ClientException - - - string - - - string - - - $name - - string - - - $value - - string - - - - getOptions - \ArangoDBClient\Connection::getOptions() - - Get the options set for the connection + + + ENTRY_SHARDING_STRATEGY + \ArangoDBClient\Collection::ENTRY_SHARDING_STRATEGY + 'shardingStrategy' + + Collection 'shardingStrategy' index - - \ArangoDBClient\ConnectionOptions - - - - getOption - \ArangoDBClient\Connection::getOption() - - Get an option set for the connection + + + ENTRY_SHARD_KEYS + \ArangoDBClient\Collection::ENTRY_SHARD_KEYS + 'shardKeys' + + Collection 'shardKeys' index - - \ArangoDBClient\ClientException - - - string - - - mixed - - - $name - - string - - - - get - \ArangoDBClient\Connection::get() - - Issue an HTTP GET request + + + ENTRY_SMART_JOIN_ATTRIBUTE + \ArangoDBClient\Collection::ENTRY_SMART_JOIN_ATTRIBUTE + 'smartJoinAttribute' + + Collection 'smartJoinAttribute' index - - \ArangoDBClient\Exception - - - string - - - array - - - \ArangoDBClient\HttpResponse - - - $url - - string - - - $customHeaders - array() - array - - - - post - \ArangoDBClient\Connection::post() - - Issue an HTTP POST request with the data provided + + + OPTION_PROPERTIES + \ArangoDBClient\Collection::OPTION_PROPERTIES + 'properties' + + properties option - - \ArangoDBClient\Exception - - - string + + + + TYPE_DOCUMENT + \ArangoDBClient\Collection::TYPE_DOCUMENT + 2 + + document collection type + + + + + TYPE_EDGE + \ArangoDBClient\Collection::TYPE_EDGE + 3 + + edge collection type + + + + + STATUS_NEW_BORN + \ArangoDBClient\Collection::STATUS_NEW_BORN + 1 + + New born collection + + + + + STATUS_UNLOADED + \ArangoDBClient\Collection::STATUS_UNLOADED + 2 + + Unloaded collection + + + + + STATUS_LOADED + \ArangoDBClient\Collection::STATUS_LOADED + 3 + + Loaded collection + + + + + STATUS_BEING_UNLOADED + \ArangoDBClient\Collection::STATUS_BEING_UNLOADED + 4 + + Collection being unloaded + + + + + STATUS_DELETED + \ArangoDBClient\Collection::STATUS_DELETED + 5 + + Deleted collection + + + + + $_id + \ArangoDBClient\Collection::_id + + + The collection id (might be NULL for new collections) + + + mixed - + + + + $_name + \ArangoDBClient\Collection::_name + + + The collection name (might be NULL for new collections) + + string - - array - - - \ArangoDBClient\HttpResponse - - - $url - - string - - - $data - - string - - - $customHeaders - array() - array - - - - put - \ArangoDBClient\Connection::put() - - Issue an HTTP PUT request with the data provided + + + $_type + \ArangoDBClient\Collection::_type + + + The collection type (might be NULL for new collections) - - \ArangoDBClient\Exception + + integer - - string + + + + $_waitForSync + \ArangoDBClient\Collection::_waitForSync + + + The collection waitForSync value (might be NULL for new collections) + + + boolean - - string + + + + $_journalSize + \ArangoDBClient\Collection::_journalSize + + + The collection journalSize value (might be NULL for new collections) + + + integer - - array + + + + $_isSystem + \ArangoDBClient\Collection::_isSystem + + + The collection isSystem value (might be NULL for new collections) + + + boolean - - \ArangoDBClient\HttpResponse + + + + $_isVolatile + \ArangoDBClient\Collection::_isVolatile + + + The collection isVolatile value (might be NULL for new collections) + + + boolean - - $url - - string - - - $data - - string - - - $customHeaders - array() - array - - - - head - \ArangoDBClient\Connection::head() - - Issue an HTTP Head request with the data provided + + + $_distributeShardsLike + \ArangoDBClient\Collection::_distributeShardsLike + + + The distributeShardsLike value (might be NULL for new collections) - - \ArangoDBClient\Exception + + mixed - - string + + + + $_numberOfShards + \ArangoDBClient\Collection::_numberOfShards + + + The collection numberOfShards value (might be NULL for new collections) + + + mixed - - array + + + + $_replicationFactor + \ArangoDBClient\Collection::_replicationFactor + + + The replicationFactor value (might be NULL for new collections) + + + mixed - - \ArangoDBClient\HttpResponse + + + + $_minReplicationFactor + \ArangoDBClient\Collection::_minReplicationFactor + + + The minimum replicationFactor value for writes to be successful + + + mixed - - $url - - string - - - $customHeaders - array() - array - - - - patch - \ArangoDBClient\Connection::patch() - - Issue an HTTP PATCH request with the data provided + + + $_shardingStrategy + \ArangoDBClient\Collection::_shardingStrategy + + + The shardingStrategy value (might be NULL for new collections) - - \ArangoDBClient\Exception - - - string - - - string + + mixed - + + + + $_shardKeys + \ArangoDBClient\Collection::_shardKeys + + + The collection shardKeys value (might be NULL for new collections) + + array - - \ArangoDBClient\HttpResponse - - - $url - - string - - - $data - - string - - - $customHeaders - array() - array - - - - delete - \ArangoDBClient\Connection::delete() - - Issue an HTTP DELETE request with the data provided + + + $_smartJoinAttribute + \ArangoDBClient\Collection::_smartJoinAttribute + + + The smartJoinAttribute value (might be NULL for new collections) - - \ArangoDBClient\Exception + + mixed - - string + + + + $_status + \ArangoDBClient\Collection::_status + + + The collection status value + + + integer - + + + + $_keyOptions + \ArangoDBClient\Collection::_keyOptions + + + The collection keyOptions value + + array - + + + + __construct + \ArangoDBClient\Collection::__construct() + + Constructs an empty collection + + string - - \ArangoDBClient\HttpResponse + + \ArangoDBClient\ClientException - $url - - string - - - $customHeaders - array() - array - - - $data - '' + $name + null string - - handleFailover - \ArangoDBClient\Connection::handleFailover() - - Execute the specified callback, and try again if it fails because -the target server is not available. In this case, try again with failing -over to an alternative server (the new leader) until the maximum number -of failover attempts have been made + + createFromArray + \ArangoDBClient\Collection::createFromArray() + + Factory method to construct a new collection - - \ArangoDBClient\Exception + + \ArangoDBClient\ClientException - - mixed + + array - - \ArangoDBClient\HttpResponse + + \ArangoDBClient\Collection - $cb + $values - mixed + array - - updateHttpHeader - \ArangoDBClient\Connection::updateHttpHeader() - - Recalculate the static HTTP header string used for all HTTP requests in this connection + + getDefaultType + \ArangoDBClient\Collection::getDefaultType() + + Get the default collection type + + string + - - getHandle - \ArangoDBClient\Connection::getHandle() - - Get a connection handle - If keep-alive connections are used, the handle will be stored and re-used - - \ArangoDBClient\ClientException - - - \ArangoDBClient\ConnectException + + __clone + \ArangoDBClient\Collection::__clone() + + Clone a collection + Returns the clone + + + void - - resource + + + + __toString + \ArangoDBClient\Collection::__toString() + + Get a string representation of the collection + Returns the collection as JSON-encoded string + + + string - - closeHandle - \ArangoDBClient\Connection::closeHandle() - - Close an existing connection handle + + toJson + \ArangoDBClient\Collection::toJson() + + Returns the collection as JSON-encoded string - - void + + string - - executeRequest - \ArangoDBClient\Connection::executeRequest() - - Execute an HTTP request and return the results - This function will throw if no connection to the server can be established or if -there is a problem during data exchange with the server. - -will restore it. - - \ArangoDBClient\Exception - - + + toSerialized + \ArangoDBClient\Collection::toSerialized() + + Returns the collection as a serialized string + + string - - string + + + + getAll + \ArangoDBClient\Collection::getAll() + + Get all collection attributes + + + array - + + + + set + \ArangoDBClient\Collection::set() + + Set a collection attribute + The key (attribute name) must be a string. + +This will validate the value of the attribute and might throw an +exception if the value is invalid. + + \ArangoDBClient\ClientException + + string - - array + + mixed - - \ArangoDBClient\HttpResponse + + void - $method + $key string - $url + $value - string + mixed + + + setId + \ArangoDBClient\Collection::setId() + + Set the collection id + This will throw if the id of an existing collection gets updated to some other id + + \ArangoDBClient\ClientException + + + mixed + + + boolean + + - $data + $id - string + mixed + + + getId + \ArangoDBClient\Collection::getId() + + Get the collection id (if already known) + Collection ids are generated on the server only. + +Collection ids are numeric but might be bigger than PHP_INT_MAX. +To reliably store a collection id elsewhere, a PHP string should be used + + mixed + + + + + setName + \ArangoDBClient\Collection::setName() + + Set the collection name + + + \ArangoDBClient\ClientException + + + string + + + void + + - $customHeaders - array() - array + $name + + string - - parseResponse - \ArangoDBClient\Connection::parseResponse() - - Parse the response return the body values as an assoc array + + getName + \ArangoDBClient\Collection::getName() + + Get the collection name (if already known) - - \ArangoDBClient\Exception + + string - - \ArangoDBClient\HttpResponse + + + + setType + \ArangoDBClient\Collection::setType() + + Set the collection type. + This is useful before a collection is create() 'ed in order to set a different type than the normal one. +For example this must be set to 3 in order to create an edge-collection. + + \ArangoDBClient\ClientException - - \ArangoDBClient\HttpResponse + + integer + + + void - $response + $type - \ArangoDBClient\HttpResponse + integer - - stopCaptureBatch - \ArangoDBClient\Connection::stopCaptureBatch() - - Stop capturing commands + + getType + \ArangoDBClient\Collection::getType() + + Get the collection type (if already known) - - \ArangoDBClient\Batch + + string - - setActiveBatch - \ArangoDBClient\Connection::setActiveBatch() - - Sets the active Batch for this connection - - - \ArangoDBClient\Batch + + setStatus + \ArangoDBClient\Collection::setStatus() + + Set the collection status. + This is useful before a collection is create()'ed in order to set a status. + + \ArangoDBClient\ClientException - - \ArangoDBClient\Batch + + integer + + + void - $batch + $status - \ArangoDBClient\Batch + integer - - getActiveBatch - \ArangoDBClient\Connection::getActiveBatch() - - returns the active batch + + getStatus + \ArangoDBClient\Collection::getStatus() + + Get the collection status (if already known) - - \ArangoDBClient\Batch + + integer - - setCaptureBatch - \ArangoDBClient\Connection::setCaptureBatch() - - Sets the batch capture state (true, if capturing) + + setKeyOptions + \ArangoDBClient\Collection::setKeyOptions() + + Set the collection key options. - - boolean + + \ArangoDBClient\ClientException + + + array + + + void - $state + $keyOptions - boolean + array - - setBatchRequest - \ArangoDBClient\Connection::setBatchRequest() - - Sets connection into Batch-request mode. This is needed for some operations to act differently when in this mode. + + getKeyOptions + \ArangoDBClient\Collection::getKeyOptions() + + Get the collection key options (if already known) - + + array + + + + + setWaitForSync + \ArangoDBClient\Collection::setWaitForSync() + + Set the waitForSync value + + boolean + + void + - $state + $value boolean - - isInBatchCaptureMode - \ArangoDBClient\Connection::isInBatchCaptureMode() - - Returns true if this connection is in Batch-Capture mode + + getWaitForSync + \ArangoDBClient\Collection::getWaitForSync() + + Get the waitForSync value (if already known) - + boolean - - getBatches - \ArangoDBClient\Connection::getBatches() - - returns the active batch - - - - - doBatch - \ArangoDBClient\Connection::doBatch() - - This is a helper function to executeRequest that captures requests if we're in batch mode + + setJournalSize + \ArangoDBClient\Collection::setJournalSize() + + Set the journalSize value - - mixed - - - string - - - mixed + + integer - - \ArangoDBClient\ClientException + + void - $method - - mixed - - - $request + $value - string + integer - - detect_utf - \ArangoDBClient\Connection::detect_utf() - - This function checks that the encoding of a string is utf. - It only checks for printable characters. - - array + + getJournalSize + \ArangoDBClient\Collection::getJournalSize() + + Get the journalSize value (if already known) + + + integer - + + + + setIsSystem + \ArangoDBClient\Collection::setIsSystem() + + Set the isSystem value + + boolean + + void + - $string + $value - array + boolean - - check_encoding - \ArangoDBClient\Connection::check_encoding() - - This function checks that the encoding of the keys and -values of the array are utf-8, recursively. - It will raise an exception if it encounters wrong encoded strings. - - array + + getIsSystem + \ArangoDBClient\Collection::getIsSystem() + + Get the isSystem value (if already known) + + + boolean - - \ArangoDBClient\ClientException + + + + setIsVolatile + \ArangoDBClient\Collection::setIsVolatile() + + Set the isVolatile value + + + boolean + + + void - $data + $value - array + boolean - - json_encode_wrapper - \ArangoDBClient\Connection::json_encode_wrapper() - - This is a json_encode() wrapper that also checks if the data is utf-8 conform. - internally it calls the check_encoding() method. If that method does not throw -an Exception, this method will happily return the json_encoded data. - + + getIsVolatile + \ArangoDBClient\Collection::getIsVolatile() + + Get the isVolatile value (if already known) + + + boolean + + + + + setDistributeShardsLike + \ArangoDBClient\Collection::setDistributeShardsLike() + + Set the distribute shards like value + + + string + + + void + + + + $value + + string + + + + getDistributeShardsLike + \ArangoDBClient\Collection::getDistributeShardsLike() + + Get the distributeShardsLike (if already known) + + mixed - + + + + setNumberOfShards + \ArangoDBClient\Collection::setNumberOfShards() + + Set the numberOfShards value + + + integer + + + void + + + + $value + + integer + + + + getNumberOfShards + \ArangoDBClient\Collection::getNumberOfShards() + + Get the numberOfShards value (if already known) + + mixed - - string + + + + setReplicationFactor + \ArangoDBClient\Collection::setReplicationFactor() + + Set the replicationFactor value + + + mixed - - \ArangoDBClient\ClientException + + void - $data + $value mixed + + + getReplicationFactor + \ArangoDBClient\Collection::getReplicationFactor() + + Get the replicationFactor value (if already known) + + + mixed + + + + + setMinReplicationFactor + \ArangoDBClient\Collection::setMinReplicationFactor() + + Set the minReplicationFactor value + + + integer + + + void + + - $options - 0 - mixed + $value + + integer - - setDatabase - \ArangoDBClient\Connection::setDatabase() - - Set the database to use with this connection - Sets the database to use with this connection, for example: 'my_database'<br> -Further calls to the database will be addressed to the given database. - + + getMinReplicationFactor + \ArangoDBClient\Collection::getMinReplicationFactor() + + Get the minReplicationFactor value (if already known) + + + mixed + + + + + setShardingStrategy + \ArangoDBClient\Collection::setShardingStrategy() + + Set the shardingStrategy value + + string + + void + - $database + $value string - - getDatabase - \ArangoDBClient\Connection::getDatabase() - - Get the database to use with this connection, for example: 'my_database' + + getShardingStrategy + \ArangoDBClient\Collection::getShardingStrategy() + + Get the sharding strategy value (if already known) - - string + + mixed - - test - \ArangoDBClient\Connection::test() - - Test if a connection can be made using the specified connection options, -i.e. endpoint (host/port), username, password + + setShardKeys + \ArangoDBClient\Collection::setShardKeys() + + Set the shardKeys value - - boolean + + array + + + void + + $value + + array + - - getCurrentEndpoint - \ArangoDBClient\Connection::getCurrentEndpoint() - - Returns the current endpoint we are currently connected to -(or, if no connection has been established yet, the next endpoint -that we will connect to) + + getShardKeys + \ArangoDBClient\Collection::getShardKeys() + + Get the shardKeys value (if already known) - - string + + array - - notify - \ArangoDBClient\Connection::notify() - - Calls the notification callback function to inform to make the -client application aware of some failure so it can do something -appropriate (e.g. logging) + + setSmartJoinAttribute + \ArangoDBClient\Collection::setSmartJoinAttribute() + + Set the smart join attribute value - + + string + + void - $message + $value - + string + + getSmartJoinAttribute + \ArangoDBClient\Collection::getSmartJoinAttribute() + + Get the smart join attribute value (if already known) + + + mixed + + + - - Argument $message is missing from the Docblock of notify - - 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 - + - ArangoDB PHP client: transaction + ArangoDB PHP client: connection - - + + + - + - Transaction - \ArangoDBClient\Transaction - - Transaction object - A transaction is an object that is used to prepare and send a transaction -to the server. - -The object encapsulates:<br /> -<ul> -<li> the collections definitions for locking -<li> the actual javascript function -<li> additional options like waitForSync, lockTimeout and params -</ul> - -The transaction object requires the connection object and can be initialized -with or without initial transaction configuration. -Any configuration can be set and retrieved by the object's methods like this:<br /> - -<pre> -$this->setAction('function (){your code};'); -$this->setCollections(array('read' => 'my_read_collection, 'write' => array('col_1', 'col2'))); -</pre> -<br /> -or like this: -<pre> -$this->action('function (){your code};'); -$this->collections(array('read' => 'my_read_collection, 'write' => array('col_1', 'col2'))); -</pre> -<br /> -There are also helper functions to set collections directly, based on their locking: -<pre> -$this->setWriteCollections($array or $string if single collection) -$this->setReadCollections($array or $string if single collection) -</pre> -<br /> - - + TraceRequest + \ArangoDBClient\TraceRequest + + Class TraceRequest + + + + - - ENTRY_COLLECTIONS - \ArangoDBClient\Transaction::ENTRY_COLLECTIONS - 'collections' - - Collections index + + $_headers + \ArangoDBClient\TraceRequest::_headers + array() + + Stores each header as an array (key => value) element + + array + - - - ENTRY_ACTION - \ArangoDBClient\Transaction::ENTRY_ACTION - 'action' - - Action index - - - - - ENTRY_WAIT_FOR_SYNC - \ArangoDBClient\Transaction::ENTRY_WAIT_FOR_SYNC - 'waitForSync' - - WaitForSync index - - - - - ENTRY_LOCK_TIMEOUT - \ArangoDBClient\Transaction::ENTRY_LOCK_TIMEOUT - 'lockTimeout' - - Lock timeout index - - - - - ENTRY_PARAMS - \ArangoDBClient\Transaction::ENTRY_PARAMS - 'params' - - Params index - - - - - ENTRY_READ - \ArangoDBClient\Transaction::ENTRY_READ - 'read' - - Read index - - - - - ENTRY_WRITE - \ArangoDBClient\Transaction::ENTRY_WRITE - 'write' - - WRITE index + + + $_method + \ArangoDBClient\TraceRequest::_method + + + Stores the http method + + string + - - - $_connection - \ArangoDBClient\Transaction::_connection + + + $_requestUrl + \ArangoDBClient\TraceRequest::_requestUrl - - The connection object + + Stores the request url - - \ArangoDBClient\Connection + + string - - $attributes - \ArangoDBClient\Transaction::attributes - array() - - The transaction's attributes. + + $_body + \ArangoDBClient\TraceRequest::_body + + + Store the string of the body - - array + + string - - $_action - \ArangoDBClient\Transaction::_action - - - + + $_type + \ArangoDBClient\TraceRequest::_type + 'request' + + The http message type - + + string + - + __construct - \ArangoDBClient\Transaction::__construct() - - Initialise the transaction object - The $transaction array can be used to specify the collections, action and further -options for the transaction in form of an array. - -Example: -array( - 'collections' => array( - 'write' => array( - 'my_collection' - ) - ), - 'action' => 'function (){}', - 'waitForSync' => true -) - - \ArangoDBClient\Connection - - + \ArangoDBClient\TraceRequest::__construct() + + Set up the request trace + + array - - \ArangoDBClient\ClientException + + string + + + string + + + string - $connection + $headers - \ArangoDBClient\Connection + array - $transactionArray - null - array + $method + + string - - - execute - \ArangoDBClient\Transaction::execute() - - Execute the transaction - This will post the query to the server and return the results as -a Cursor. The cursor can then be used to iterate the results. - - \ArangoDBClient\Exception - - - mixed - - - - - getConnection - \ArangoDBClient\Transaction::getConnection() - - Return the connection object - - - \ArangoDBClient\Connection - - - - - setCollections - \ArangoDBClient\Transaction::setCollections() - - Set the collections array. - The array should have 2 sub-arrays, namely 'read' and 'write' which should hold the respective collections -for the transaction - - array - - - $value + $requestUrl - array + string + + + $body + + string - - getCollections - \ArangoDBClient\Transaction::getCollections() - - Get collections array - This holds the read and write collections of the transaction - + + getHeaders + \ArangoDBClient\TraceRequest::getHeaders() + + Get an array of the request headers + + array - - setAction - \ArangoDBClient\Transaction::setAction() - - set action value + + getMethod + \ArangoDBClient\TraceRequest::getMethod() + + Get the request method - + string - - \ArangoDBClient\ClientException - - - $value - - string - - - getAction - \ArangoDBClient\Transaction::getAction() - - get action value + + getRequestUrl + \ArangoDBClient\TraceRequest::getRequestUrl() + + Get the request url - + string - - setWaitForSync - \ArangoDBClient\Transaction::setWaitForSync() - - set waitForSync value - - - boolean - - - \ArangoDBClient\ClientException - - - - $value - - boolean - - - - getWaitForSync - \ArangoDBClient\Transaction::getWaitForSync() - - get waitForSync value + + getBody + \ArangoDBClient\TraceRequest::getBody() + + Get the body of the request - - boolean + + string - - setLockTimeout - \ArangoDBClient\Transaction::setLockTimeout() - - Set lockTimeout value + + getType + \ArangoDBClient\TraceRequest::getType() + + Get the http message type - - integer - - - \ArangoDBClient\ClientException + + string - - $value - - integer - - - getLockTimeout - \ArangoDBClient\Transaction::getLockTimeout() - - Get lockTimeout value + + eJylVk1vm0AQvfMr5mDJHyJ1k97skqZxVVuVKkWpe6ora40nBgUWurtYsqr+987uAsaATa1y8cfMm/fmzbDw/kMapM54NHJgBB8F47vk0yM8LZ7Aj0LkagJ+wjn6Kkw4peish5T5r2yHACVgZnJNkGUqSATF4Avj8E0hxozzWugz4fxQwizIqIAJ+kl6EOEuUDArv929vb1zQYmQ2LiEebxZuBSOkh1HF+YoqPSB0GPH4SxGScKwpmnqFM3NIiYlLAXlPOOvDKUq+rmo62KzMuS+DgHcvnlnhPhNlt+OTjAq9DUiUxKBEpD5AQTItiiASSC3mBDsAINXPIB3D3sWZTgEjDA2fAZc1HjYM2Hz83/G5jMV4Z4phN7aFpbgwY+fZEK7BBUgBEqlECNZsG3jkGS/tqKVxMIulhfWBchEdHX5HPtdRGcoDIMtAcmL+bVJtoeriTSoSbE8uiOl3gF1SPHq2hpEU+jnzfRbWkGyJz1xS+kFqlOlTLA4XxLoFQOm68ZgbYBsMJrzcA2ce9Wzg4MjuCA+WYQ66jiPGuo43DpEOwtQITpOy8isjCs3LttEoQ8vGTdnDqzXdAARKPPVoOjZLRpwq5pcyzY0ZexNp6+eCkJ5c7+u+OWV7k0baRVnvIKmmVVxwqtqaGZWDPCsQJvzp7EGc1qD8hDIt7kw+HSapdcCVSZ42zlQc3GHamFLDOr+5DVqNl0SeXZf6rra7oumsK+mRJeu6iS6ZbWcNldpei4n2qWrPvvz2swmnM71vzQ+Ur0udV37pv7liLtK1ZIKdKnSJIUq0mWemWsWhUwOqk/OycREXOivineAVf4Q3qyqif3h1PkLRzV67g== + + + + ArangoDB PHP client: AqlUserFunction + + + + + + + + AqlUserFunction + \ArangoDBClient\AqlUserFunction + + Provides management of user-functions + AqlUserFunction object<br> +An AqlUserFunction is an object that is used to manage AQL User Functions.<br> +It registers, un-registers and lists user functions on the server<br> +<br> +The object encapsulates:<br> +<br> +<ul> +<li> the name of the function +<li> the actual javascript function +</ul> +<br> +The object requires the connection object and can be initialized +with or without initial configuration.<br> +<br> +Any configuration can be set and retrieved by the object's methods like this:<br> +<br> +<pre> +$this->setName('myFunctions:myFunction');<br> +$this->setCode('function (){your code};'); +</pre> + +<br> +or like this:<br> +<br> +<pre> +$this->name('myFunctions:myFunction');<br> +$this->code('function (){your code};'); +</pre> + + + + + ENTRY_NAME + \ArangoDBClient\AqlUserFunction::ENTRY_NAME + 'name' + + Collections index - - integer + + + + ENTRY_CODE + \ArangoDBClient\AqlUserFunction::ENTRY_CODE + 'code' + + Action index + + + + + $_connection + \ArangoDBClient\AqlUserFunction::_connection + + + The connection object + + + \ArangoDBClient\Connection - - - setParams - \ArangoDBClient\Transaction::setParams() - - Set params value + + + $attributes + \ArangoDBClient\AqlUserFunction::attributes + array() + + The function's attributes. - + + array + + + + + __construct + \ArangoDBClient\AqlUserFunction::__construct() + + Initialise the AqlUserFunction object + The $attributesArray array can be used to specify the name and code for the user function in form of an array. + +Example: +array( + 'name' => 'myFunctions:myFunction', + 'code' => 'function (){}' +) + + \ArangoDBClient\Connection + + array - + \ArangoDBClient\ClientException - $value + $connection + \ArangoDBClient\Connection + + + $attributesArray + null array - - getParams - \ArangoDBClient\Transaction::getParams() - - Get params value - - - array + + register + \ArangoDBClient\AqlUserFunction::register() + + Registers the user function + If no parameters ($name,$code) are passed, it will use the properties of the object. + +If $name and/or $code are passed, it will override the object's properties with the passed ones + + null + + + null + + + \ArangoDBClient\Exception + + + mixed + + + + $name + null + null + + + $code + null + null + + + + unregister + \ArangoDBClient\AqlUserFunction::unregister() + + Un-register the user function + If no parameter ($name) is passed, it will use the property of the object. + +If $name is passed, it will override the object's property with the passed one + + string + + + boolean + + + \ArangoDBClient\Exception + + + mixed + + + + $name + null + string + + + $namespace + false + boolean + + + + getRegisteredUserFunctions + \ArangoDBClient\AqlUserFunction::getRegisteredUserFunctions() + + Get registered user functions + The method can optionally be passed a $namespace parameter to narrow the results down to a specific namespace. + + null + + + \ArangoDBClient\Exception + + + mixed + + $namespace + null + null + - - setWriteCollections - \ArangoDBClient\Transaction::setWriteCollections() - - Convenience function to directly set write-collections without having to access -them from the collections attribute. + + getConnection + \ArangoDBClient\AqlUserFunction::getConnection() + + Return the connection object - - array + + \ArangoDBClient\Connection + + + + + setName + \ArangoDBClient\AqlUserFunction::setName() + + Set name of the user function. It must have at least one namespace, but also can have sub-namespaces. + correct: +'myNamespace:myFunction' +'myRootNamespace:mySubNamespace:myFunction' + +wrong: +'myFunction' + + string + + + \ArangoDBClient\ClientException $value - array + string - - getWriteCollections - \ArangoDBClient\Transaction::getWriteCollections() - - Convenience function to directly get write-collections without having to access -them from the collections attribute. + + getName + \ArangoDBClient\AqlUserFunction::getName() + + Get name value - - array + + string - - setReadCollections - \ArangoDBClient\Transaction::setReadCollections() - - Convenience function to directly set read-collections without having to access -them from the collections attribute. + + setCode + \ArangoDBClient\AqlUserFunction::setCode() + + Set user function code - - array + + string + + + \ArangoDBClient\ClientException $value - array + string - - getReadCollections - \ArangoDBClient\Transaction::getReadCollections() - - Convenience function to directly get read-collections without having to access -them from the collections attribute. + + getCode + \ArangoDBClient\AqlUserFunction::getCode() + + Get user function code - - array + + string - + set - \ArangoDBClient\Transaction::set() - - Sets an attribute + \ArangoDBClient\AqlUserFunction::set() + + Set an attribute - - - + + + + \ArangoDBClient\AqlUserFunction + + \ArangoDBClient\ClientException + $key @@ -4958,26 +5603,23 @@ them from the collections attribute. - + __set - \ArangoDBClient\Transaction::__set() - + \ArangoDBClient\AqlUserFunction::__set() + Set an attribute, magic method This is a magic method that allows the object to be used without -declaring all document attributes first. - +declaring all attributes first. + \ArangoDBClient\ClientException - - + + string - + mixed - - void - $key @@ -4990,16 +5632,16 @@ declaring all document attributes first. mixed - + get - \ArangoDBClient\Transaction::get() - + \ArangoDBClient\AqlUserFunction::get() + Get an attribute - + string - + mixed @@ -5009,18 +5651,17 @@ declaring all document attributes first. string - - __get - \ArangoDBClient\Transaction::__get() - - Get an attribute, magic method - This function is mapped to get() internally. - - + + __isset + \ArangoDBClient\AqlUserFunction::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. + + string - - mixed + + boolean @@ -5029,17 +5670,18 @@ declaring all document attributes first. string - - __isset - \ArangoDBClient\Transaction::__isset() - - Is triggered by calling isset() or empty() on inaccessible properties. - - + + __get + \ArangoDBClient\AqlUserFunction::__get() + + Get an attribute, magic method + This function is mapped to get() internally. + + string - - boolean + + mixed @@ -5048,26 +5690,14 @@ declaring all document attributes first. string - - __toString - \ArangoDBClient\Transaction::__toString() - - Returns the action string - - - - string - - - - - buildTransactionAttributesFromArray - \ArangoDBClient\Transaction::buildTransactionAttributesFromArray() - + + buildAttributesFromArray + \ArangoDBClient\AqlUserFunction::buildAttributesFromArray() + Build the object's attributes from a given array - - + + \ArangoDBClient\ClientException @@ -5077,293 +5707,142 @@ declaring all document attributes first. - - $collection - - - - The collections array that includes both read and write collection definitions - - - array - - - - array - - - - - $readCollection - - - - The read-collections array or string (if only one) - - - mixed - - - - mixed - - - - - $writeCollection - - - - The write-collections array or string (if only one) - - - mixed - - - - mixed - - - - - $action + + $name - - The action to pass to the server + - The name of the user function - + string - - + + string - - $waitForSync - - - - WaitForSync on the transaction - - - boolean - - - - boolean - - - - - $lockTimeout + + $code - - LockTimeout on the transaction + - The code of the user function - - integer + + string - - - integer + + + string - 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 - + - ArangoDB PHP client: result set cursor for exports + ArangoDB PHP client: Traversal - - - + + + - + - ExportCursor - \ArangoDBClient\ExportCursor - - Provides access to the results of a collection export - The cursor might not contain all results in the beginning.<br> + Traversal + \ArangoDBClient\Traversal + + Provides graph traversal + A Traversal object is used to execute a graph traversal on the server side.<br> +<br> -If the result set is too big to be transferred in one go, the -cursor might issue additional HTTP requests to fetch the -remaining results from the server. - - +The object requires the connection object, the startVertex, the edgeCollection and the optional parameters.<br> +<br> + + + - - ENTRY_ID - \ArangoDBClient\ExportCursor::ENTRY_ID - 'id' - - result entry for cursor id - - - - - ENTRY_HASMORE - \ArangoDBClient\ExportCursor::ENTRY_HASMORE - 'hasMore' - - result entry for "hasMore" flag - - - - - ENTRY_RESULT - \ArangoDBClient\ExportCursor::ENTRY_RESULT - 'result' - - result entry for result documents - - - - - ENTRY_FLAT - \ArangoDBClient\ExportCursor::ENTRY_FLAT - '_flat' - - "flat" option entry (will treat the results as a simple array, not documents) - - - - - ENTRY_COUNT - \ArangoDBClient\ExportCursor::ENTRY_COUNT - 'count' - - result entry for document count + + OPTION_FIELDS + \ArangoDBClient\Traversal::OPTION_FIELDS + 'fields' + + count fields - - ENTRY_TYPE - \ArangoDBClient\ExportCursor::ENTRY_TYPE - 'type' - - "type" option entry (is used when converting the result into documents or edges objects) + + ENTRY_STARTVERTEX + \ArangoDBClient\Traversal::ENTRY_STARTVERTEX + 'startVertex' + + Collections index - - ENTRY_BASEURL - \ArangoDBClient\ExportCursor::ENTRY_BASEURL - 'baseurl' - - "baseurl" option entry. + + ENTRY_EDGECOLLECTION + \ArangoDBClient\Traversal::ENTRY_EDGECOLLECTION + 'edgeCollection' + + Action index - + $_connection - \ArangoDBClient\ExportCursor::_connection + \ArangoDBClient\Traversal::_connection - + The connection object - + \ArangoDBClient\Connection - - $_options - \ArangoDBClient\ExportCursor::_options - - - Cursor options + + $attributes + \ArangoDBClient\Traversal::attributes + array() + + The traversal's attributes. - + array - - $_result - \ArangoDBClient\ExportCursor::_result + + $_action + \ArangoDBClient\Traversal::_action - - The current result set + + - - array - + - - $_hasMore - \ArangoDBClient\ExportCursor::_hasMore - - - "has more" indicator - if true, the server has more results - - - boolean - - - - - $_id - \ArangoDBClient\ExportCursor::_id - - - cursor id - might be NULL if cursor does not have an id + + __construct + \ArangoDBClient\Traversal::__construct() + + Initialise the Traversal object - - mixed + + \ArangoDBClient\Connection - - - - $_fetches - \ArangoDBClient\ExportCursor::_fetches - 1 - - number of HTTP calls that were made to build the cursor result - - - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - - - + string - - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - - - + string - - - - __construct - \ArangoDBClient\ExportCursor::__construct() - - Initialize the cursor with the first results and some metadata - - - \ArangoDBClient\Connection - - - array - - + array - + \ArangoDBClient\ClientException @@ -5373,4039 +5852,3589 @@ remaining results from the server. \ArangoDBClient\Connection - $data + $startVertex - array + string - $options + $edgeCollection + string + + + $options + null array - - delete - \ArangoDBClient\ExportCursor::delete() - - Explicitly delete the cursor - This might issue an HTTP DELETE request to inform the server about -the deletion. - - \ArangoDBClient\Exception - - - boolean - - - - - getCount - \ArangoDBClient\ExportCursor::getCount() - - Get the total number of results in the export - - - integer - - - - - getNextBatch - \ArangoDBClient\ExportCursor::getNextBatch() - - Get next results as an array - This might issue additional HTTP requests to fetch any outstanding -results from the server - - \ArangoDBClient\Exception - - - mixed - - - - - setData - \ArangoDBClient\ExportCursor::setData() - - Create an array of results from the input array + + getResult + \ArangoDBClient\Traversal::getResult() + + Execute and get the traversal result - + array - - void + + \ArangoDBClient\Exception - + \ArangoDBClient\ClientException - - $data - - array - - - fetchOutstanding - \ArangoDBClient\ExportCursor::fetchOutstanding() - - Fetch outstanding results from the server + + getConnection + \ArangoDBClient\Traversal::getConnection() + + Return the connection object - - \ArangoDBClient\Exception - - - void + + \ArangoDBClient\Connection - - url - \ArangoDBClient\ExportCursor::url() - - Return the base URL for the cursor - - + + setStartVertex + \ArangoDBClient\Traversal::setStartVertex() + + Set name of the user function. It must have at least one namespace, but also can have sub-namespaces. + correct: +'myNamespace:myFunction' +'myRootNamespace:mySubNamespace:myFunction' + +wrong: +'myFunction' + string - - - - getFetches - \ArangoDBClient\ExportCursor::getFetches() - - Return the number of HTTP calls that were made to build the cursor result - - - integer + + \ArangoDBClient\ClientException + + $value + + string + - - getId - \ArangoDBClient\ExportCursor::getId() - - Return the cursor id, if any + + getStartVertex + \ArangoDBClient\Traversal::getStartVertex() + + Get name value - + string - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use + + setEdgeCollection + \ArangoDBClient\Traversal::setEdgeCollection() + + Set user function code - + string - - \ArangoDBClient\DocumentClassable + + \ArangoDBClient\ClientException - $class + $value string - \ArangoDBClient\DocumentClassable - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use + + getEdgeCollection + \ArangoDBClient\Traversal::getEdgeCollection() + + Get user function code - + string - - \ArangoDBClient\DocumentClassable + + + + set + \ArangoDBClient\Traversal::set() + + Set an attribute + + + + + \ArangoDBClient\ClientException - $class + $key - string + - \ArangoDBClient\DocumentClassable - - - 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 - - - - ArangoDB PHP client: URL helper methods - - - - - - - - UrlHelper - \ArangoDBClient\UrlHelper - - Some helper methods to construct and process URLs - - - - - - getDocumentIdFromLocation - \ArangoDBClient\UrlHelper::getDocumentIdFromLocation() - - Get the document id from a location header - - - string - - - string - - - $location + $value - string + - - buildUrl - \ArangoDBClient\UrlHelper::buildUrl() - - Construct a URL from a base URL and additional parts, separated with '/' each - This function accepts variable arguments. - + + __set + \ArangoDBClient\Traversal::__set() + + Set an attribute, magic method + This is a magic method that allows the object to be used without +declaring all attributes first. + + \ArangoDBClient\ClientException + + string - - array + + mixed - - string + + + void - $baseUrl + $key string - $parts - array() - array + $value + + mixed - - appendParamsUrl - \ArangoDBClient\UrlHelper::appendParamsUrl() - - Append parameters to a URL - Parameter values will be URL-encoded - + + get + \ArangoDBClient\Traversal::get() + + Get an attribute + + + string - - array - - - string + + mixed - $baseUrl + $key string + + + __get + \ArangoDBClient\Traversal::__get() + + Get an attribute, magic method + This function is mapped to get() internally. + + + string + + + mixed + + - $params + $key - array + string - - getBoolString - \ArangoDBClient\UrlHelper::getBoolString() - - Get a string from a boolean value + + __isset + \ArangoDBClient\Traversal::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. - - mixed - - + string + + boolean + - $value + $key - mixed + string + + __toString + \ArangoDBClient\Traversal::__toString() + + Returns the action string + + + + string + + + - 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 - + - ArangoDB PHP client: AQL query result cache handling + ArangoDB PHP client: View class - + + - - \ArangoDBClient\Handler - QueryCacheHandler - \ArangoDBClient\QueryCacheHandler - - A base class for REST-based handlers - - - + + + View + \ArangoDBClient\View + + Value object representing a view + <br> + + - - $_connection - \ArangoDBClient\Handler::_connection - - - Connection object + + ENTRY_ID + \ArangoDBClient\View::ENTRY_ID + 'id' + + View id index - - \ArangoDBClient\Connection - - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - + + + ENTRY_NAME + \ArangoDBClient\View::ENTRY_NAME + 'name' + + View name index - + + + + ENTRY_TYPE + \ArangoDBClient\View::ENTRY_TYPE + 'type' + + View type index + + + + + $_id + \ArangoDBClient\View::_id + + + The view id (might be NULL for new views) + + string - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - + + $_name + \ArangoDBClient\View::_name + + + The view name - + string - - enable - \ArangoDBClient\QueryCacheHandler::enable() - - Globally turns on the AQL query result cache + + __construct + \ArangoDBClient\View::__construct() + + Constructs an empty view - - \ArangoDBClient\Exception + + array - - - - disable - \ArangoDBClient\QueryCacheHandler::disable() - - Globally turns off the AQL query result cache - - - \ArangoDBClient\Exception - - - - - enableDemandMode - \ArangoDBClient\QueryCacheHandler::enableDemandMode() - - Globally sets the AQL query result cache to demand mode - - - \ArangoDBClient\Exception - - - - - clear - \ArangoDBClient\QueryCacheHandler::clear() - - Clears the AQL query result cache for the current database - - - \ArangoDBClient\Exception - - - - - getEntries - \ArangoDBClient\QueryCacheHandler::getEntries() - - Returns the entries from the query cache in current database - - - \ArangoDBClient\Exception - - - array - - - - - setProperties - \ArangoDBClient\QueryCacheHandler::setProperties() - - Adjusts the global AQL query result cache properties - - - \ArangoDBClient\Exception - - - array + + string - - array + + + \ArangoDBClient\ClientException - $properties + $name array - - - getProperties - \ArangoDBClient\QueryCacheHandler::getProperties() - - Returns the AQL query result cache properties - - - \ArangoDBClient\Exception - - - array - - - - - __construct - \ArangoDBClient\Handler::__construct() - - Construct a new handler - - - \ArangoDBClient\Connection - - - $connection + $type - \ArangoDBClient\Connection + string - \ArangoDBClient\Handler - - getConnection - \ArangoDBClient\Handler::getConnection() - - Return the connection object + + getId + \ArangoDBClient\View::getId() + + Return the view id - - \ArangoDBClient\Connection + + string - \ArangoDBClient\Handler - - getConnectionOption - \ArangoDBClient\Handler::getConnectionOption() - - Return a connection option -This is a convenience function that calls json_encode_wrapper on the connection + + setId + \ArangoDBClient\View::setId() + + Set the view's id - - - mixed - - - \ArangoDBClient\ClientException - - - - $optionName - - - - \ArangoDBClient\Handler - - - json_encode_wrapper - \ArangoDBClient\Handler::json_encode_wrapper() - - Return a json encoded string for the array passed. - This is a convenience function that calls json_encode_wrapper on the connection - - array - - + string - - \ArangoDBClient\ClientException - - - - $body - - array - - \ArangoDBClient\Handler - - - includeOptionsInBody - \ArangoDBClient\Handler::includeOptionsInBody() - - Helper function that runs through the options given and includes them into the parameters array given. - Only options that are set in $includeArray will be included. -This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - - array - - - array - - - array - - - array + + void - $options - - array - - - $body + $id - array - - - $includeArray - array() - array + - \ArangoDBClient\Handler - - makeCollection - \ArangoDBClient\Handler::makeCollection() - - Turn a value into a collection name + + getName + \ArangoDBClient\View::getName() + + Return the view name - - \ArangoDBClient\ClientException - - - mixed - - + string - - $value - - mixed - - \ArangoDBClient\Handler - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use + + getType + \ArangoDBClient\View::getType() + + Return the view type - + string - - \ArangoDBClient\DocumentClassable - - - $class - - string - - \ArangoDBClient\DocumentClassable - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use + + getAll + \ArangoDBClient\View::getAll() + + Return the view as an array - - string - - - \ArangoDBClient\DocumentClassable + + array - - $class - - string - - \ArangoDBClient\DocumentClassable - - No summary for class \ArangoDBClient\QueryCacheHandler - - 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 - + - ArangoDB PHP client: mixin for $_documentClass functionality + ArangoDB PHP client: default values - + - - DocumentClassable - \ArangoDBClient\DocumentClassable - - Add functionality for $_documentClass - - - + + + DefaultValues + \ArangoDBClient\DefaultValues + + Contains default values used by the client + <br> + + - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - - - - string - - - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - - - - string - - - - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use - - - string - - - \ArangoDBClient\DocumentClassable - - - - $class - - string - - - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use + + DEFAULT_PORT + \ArangoDBClient\DefaultValues::DEFAULT_PORT + 8529 + + Default port number (used if no port specified) - - string - - - \ArangoDBClient\DocumentClassable - - - $class - - string - - - - eJydUU1PwkAQve+vmAMJSlD8OhjxAwWC8UTClcQs26Hd2O42u1MjMfx3t1uoFAoS59Jm5817897cP6VRylin1WLQgmfDVagHLzB+HYOIJSq6g0R+SQVzbaDxHmiRJe61H3NrYZ4pQVIrHktauPmcopdy8cFDBCjZ+p7IN3lGkSNy9cYVTAgx4Ur5ltDpwsgwIuiXf1cXl7dtICMdobIwSmavbdeOdaiwDSM0bjoX7jCmeILWaeOWbPfXXBBUN67ztO2ixoOVSuT2rs9vvDQZLgkGmyx8FiP7ZrlPL56Xm/zkBqxzo8IS7lLOkyQNmcUVsOO/qdGEgjDYif0BmtPqXtM1XbPrZw8pDwNn6yhVdMi9ijmNU9tWmiA53gghOGCwXCvlhifrxRoF8lAy0DNImVE1aVdMZLNYivLYYJEqAyeF1KkHF2fKq0GRtGePO2kX6G6JW+3g4cXrsjb1MgvcE/nBHPbd6f8ZDNf3/MP/5t2P8c6W7AdpWkd8 - - - - ArangoDB PHP client: document handler - - - - - - - - \ArangoDBClient\Handler - DocumentHandler - \ArangoDBClient\DocumentHandler - - A handler that manages documents - A document handler that fetches documents from the server and -persists them on the server. It does so by issuing the -appropriate HTTP requests to the server.<br> - -<br> - - - - - - ENTRY_DOCUMENTS - \ArangoDBClient\DocumentHandler::ENTRY_DOCUMENTS - 'documents' - - documents array index + + + DEFAULT_TIMEOUT + \ArangoDBClient\DefaultValues::DEFAULT_TIMEOUT + 30 + + Default timeout value (used if no timeout value specified) - OPTION_COLLECTION - \ArangoDBClient\DocumentHandler::OPTION_COLLECTION - 'collection' + DEFAULT_FAILOVER_TRIES + \ArangoDBClient\DefaultValues::DEFAULT_FAILOVER_TRIES + 3 - collection parameter + Default number of failover servers to try (used in case there is an automatic failover) +if set to 0, then an unlimited amount of servers will be tried - OPTION_EXAMPLE - \ArangoDBClient\DocumentHandler::OPTION_EXAMPLE - 'example' + DEFAULT_FAILOVER_TIMEOUT + \ArangoDBClient\DefaultValues::DEFAULT_FAILOVER_TIMEOUT + 30 - example parameter + Default max amount of time (in seconds) that is spent waiting on failover - OPTION_OVERWRITE - \ArangoDBClient\DocumentHandler::OPTION_OVERWRITE - 'overwrite' + DEFAULT_AUTH_TYPE + \ArangoDBClient\DefaultValues::DEFAULT_AUTH_TYPE + 'Basic' - overwrite option + Default Authorization type (use HTTP basic authentication) - OPTION_RETURN_OLD - \ArangoDBClient\DocumentHandler::OPTION_RETURN_OLD - 'returnOld' + DEFAULT_WAIT_SYNC + \ArangoDBClient\DefaultValues::DEFAULT_WAIT_SYNC + false - option for returning the old document + Default value for waitForSync (fsync all data to disk on document updates/insertions/deletions) - OPTION_RETURN_NEW - \ArangoDBClient\DocumentHandler::OPTION_RETURN_NEW - 'returnNew' + DEFAULT_JOURNAL_SIZE + \ArangoDBClient\DefaultValues::DEFAULT_JOURNAL_SIZE + 33554432 - option for returning the new document + Default value for collection journal size - - $_connection - \ArangoDBClient\Handler::_connection - - - Connection object + + DEFAULT_IS_VOLATILE + \ArangoDBClient\DefaultValues::DEFAULT_IS_VOLATILE + false + + Default value for isVolatile - - \ArangoDBClient\Connection - - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - + + + DEFAULT_CREATE + \ArangoDBClient\DefaultValues::DEFAULT_CREATE + false + + Default value for createCollection (create the collection on the fly when the first document is added to an unknown collection) - - string - - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - + + + DEFAULT_CONNECTION + \ArangoDBClient\DefaultValues::DEFAULT_CONNECTION + 'Keep-Alive' + + Default value for HTTP Connection header - - string - - - - get - \ArangoDBClient\DocumentHandler::get() - - Get a single document from a collection - Alias method for getById() - - \ArangoDBClient\Exception - - - string - - - mixed - - - array - - - \ArangoDBClient\Document - + + + DEFAULT_VERIFY_CERT + \ArangoDBClient\DefaultValues::DEFAULT_VERIFY_CERT + false + + Default value for SSL certificate verification + - - $collection - - string - - - $documentId - - mixed - - - $options - array() - array - - - - has - \ArangoDBClient\DocumentHandler::has() - - Check if a document exists - This will call self::get() internally and checks if there -was an exception thrown which represents an 404 request. - - \ArangoDBClient\Exception - - + + + DEFAULT_VERIFY_CERT_NAME + \ArangoDBClient\DefaultValues::DEFAULT_VERIFY_CERT_NAME + false + + Default value for SSL certificate host name verification + + + + + DEFAULT_ALLOW_SELF_SIGNED + \ArangoDBClient\DefaultValues::DEFAULT_ALLOW_SELF_SIGNED + true + + Default value for accepting self-signed SSL certificates + + + + + DEFAULT_CIPHERS + \ArangoDBClient\DefaultValues::DEFAULT_CIPHERS + null + + Default value for ciphers to be used in SSL + + + + + DEFAULT_UPDATE_POLICY + \ArangoDBClient\DefaultValues::DEFAULT_UPDATE_POLICY + \ArangoDBClient\UpdatePolicy::ERROR + + Default update policy + + + + + DEFAULT_REPLACE_POLICY + \ArangoDBClient\DefaultValues::DEFAULT_REPLACE_POLICY + \ArangoDBClient\UpdatePolicy::ERROR + + Default replace policy + + + + + DEFAULT_DELETE_POLICY + \ArangoDBClient\DefaultValues::DEFAULT_DELETE_POLICY + \ArangoDBClient\UpdatePolicy::ERROR + + Default delete policy + + + + + DEFAULT_CHECK_UTF8_CONFORM + \ArangoDBClient\DefaultValues::DEFAULT_CHECK_UTF8_CONFORM + false + + Default value for checking if data is UTF-8 conform + + + + + eJydVltP4zgUfu+vOG8UBFO2DBJbZi+ZNKWZCU2VpoxYIUVu4rReHDuKHdjOav/7HLsX6EjNFvqSNOfyfedqf/qjXJStVufkpAUn4FREzGX/M4yHY0g5o0L3IKM5qbmGJ8JrqlDNaP5ZkvSRzCnA1si1+lZIar2QFcrgCxEw0ZQWRAgrSmW5rNh8ocHdvnXPf+megq4YOhQKborZ8BTFXM4FPYUbWqH1Eq07rZYgBVWITX+Cvd7G4EqhCUM3u7yhVjSD2RL0gq5DW4fyaVb9flBUionUiADOP3QtHTJTuiKpRodEKeivEO9Wifq3ZVQtK/M72YihlJUGURczWkHb0mI5CLn6rkqaspzR7Hht1rHPVAqloe8NnGkQJ+MwiuE3uLrs/oqB74HRrKCyXse/A7QrOQgx9m+9cGpAL86vrXwf7DowmUNOGJdP+K5ohQ8FGqGr5YaKgJQoaupRUWAKsFOwb2RBNEu3thtOhrmi2rg4PzU2wujXgrOCafRGClkLbVA3YM+Mc5hR01Y0a4hs4PhBeOdFSRz53sQE2BxfQf55hWZSCW2MRVF0m6lj5Ea0CQfTiirPhGkm5iDFNqSDuBycbseOGvuOWUMMvSxXpYZhHI9hRhTm0kwjcmGp1WmqsjONh0l8P/YQ+OizMT7a31+r7slxzk2QA1lNliKFdq7Mg2DyM6KJKVjG1KNJQCbTujBJqUsUUdXBKaWV4aQ6GeXUvjXR++b4cTK5H7lILydc0UPIpZJzmtrs/C3rShAOin2nDTBfwmk0coJk4v9lEnFxcXn58eNF9xAwpu4kxzTzJv/+JLkLAyf2A+9NgVQUs+a+hNNefVlttJfPpg3wS86X8GzmxP5hFRLYFsBMW5bh2GB17Bg9CvksXjlpqoIbeU78Jua2F3EvizXDBSVZ4xy44WjkubEfjkwjfqW0PHM4e6IHdeNkEkBq+io3HU8BR271itANmDh2/uA+cT27WtexNU3efsSFRL/mpHoHdjJybt+UXJKmtLQ7RlGenymGh2b2MyXVNPRBEH5LJl4wwI6/GXl9RNdVfVhPsnKx3uy4ajd7HcGbiuuPh15kNq2oOd+PstoSeCpyli4b/E3HfexHPBMD371Hr1NrN7ZmvZ4XRWG0H6SiJTe3if9Fibxx4LjvhbHr7QCUvhd4747lVVkWNH00LYGnpt3COPDTeHB2ZeBQoWgqz9BzvyaofWXGcBBGty/d+F+rZW86CeGMqPbOfafXs6JTOHrY3OQe1peo2cOO5tHxdesHwdIT5g== + + + + ArangoDB PHP client: single user document + + + + + + + \ArangoDBClient\Document + User + \ArangoDBClient\User + + Value object representing a single User document + <br> + + + + + + ENTRY_ID + \ArangoDBClient\Document::ENTRY_ID + '_id' + + Document id index + + + + + ENTRY_KEY + \ArangoDBClient\Document::ENTRY_KEY + '_key' + + Document key index + + + + + ENTRY_REV + \ArangoDBClient\Document::ENTRY_REV + '_rev' + + Revision id index + + + + + ENTRY_ISNEW + \ArangoDBClient\Document::ENTRY_ISNEW + '_isNew' + + isNew id index + + + + + ENTRY_HIDDENATTRIBUTES + \ArangoDBClient\Document::ENTRY_HIDDENATTRIBUTES + '_hiddenAttributes' + + hidden attribute index + + + + + ENTRY_IGNOREHIDDENATTRIBUTES + \ArangoDBClient\Document::ENTRY_IGNOREHIDDENATTRIBUTES + '_ignoreHiddenAttributes' + + hidden attribute index + + + + + OPTION_WAIT_FOR_SYNC + \ArangoDBClient\Document::OPTION_WAIT_FOR_SYNC + 'waitForSync' + + waitForSync option index + + + + + OPTION_POLICY + \ArangoDBClient\Document::OPTION_POLICY + 'policy' + + policy option index + + + + + OPTION_KEEPNULL + \ArangoDBClient\Document::OPTION_KEEPNULL + 'keepNull' + + keepNull option index + + + + + KEY_REGEX_PART + \ArangoDBClient\Document::KEY_REGEX_PART + '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' + + regular expression used for key validation + + + + + $_id + \ArangoDBClient\Document::_id + + + The document id (might be NULL for new documents) + + string - - mixed - - - boolean - - - $collection - - string - - - $documentId - - mixed - - - - getById - \ArangoDBClient\DocumentHandler::getById() - - Get a single document from a collection - This will throw if the document cannot be fetched from the server. - - \ArangoDBClient\Exception - - + + + $_key + \ArangoDBClient\Document::_key + + + The document key (might be NULL for new documents) + + string - + + + + $_rev + \ArangoDBClient\Document::_rev + + + The document revision (might be NULL for new documents) + + mixed - - array - - - \ArangoDBClient\Document - - - $collection - - string - - - $documentId - - mixed - - - $options - array() - array - - - - getHead - \ArangoDBClient\DocumentHandler::getHead() - - Gets information about a single documents from a collection - This will throw if the document cannot be fetched from the server - - \ArangoDBClient\Exception + + + $_values + \ArangoDBClient\Document::_values + array() + + The document attributes (names/values) + + + array - - string + + + + $_changed + \ArangoDBClient\Document::_changed + false + + Flag to indicate whether document was changed locally + + + boolean - - mixed + + + + $_isNew + \ArangoDBClient\Document::_isNew + true + + Flag to indicate whether document is a new document (never been saved to the server) + + + boolean - + + + + $_doValidate + \ArangoDBClient\Document::_doValidate + false + + Flag to indicate whether validation of document values should be performed +This can be turned on, but has a performance penalty + + boolean - - string + + + + $_hiddenAttributes + \ArangoDBClient\Document::_hiddenAttributes + array() + + An array, that defines which attributes should be treated as hidden. + + + array - + + + + $_ignoreHiddenAttributes + \ArangoDBClient\Document::_ignoreHiddenAttributes + false + + Flag to indicate whether hidden attributes should be ignored or included in returned data-sets + + + boolean + + + + + __construct + \ArangoDBClient\Document::__construct() + + Constructs an empty document + + array - $collection - - string - - - $documentId - - mixed - - - $revision - null - string - - - $ifMatch + $options null - boolean + array + \ArangoDBClient\Document - - createFromArrayWithContext - \ArangoDBClient\DocumentHandler::createFromArrayWithContext() - - Intermediate function to call the createFromArray function from the right context + + createFromArray + \ArangoDBClient\Document::createFromArray() + + Factory method to construct a new document using the values passed to populate it - - - - \ArangoDBClient\Document - - + \ArangoDBClient\ClientException + + array + + + array + + + \ArangoDBClient\Document + \ArangoDBClient\Edge + \ArangoDBClient\Graph + - $data + $values - + array $options - - + array() + array + \ArangoDBClient\Document - - store - \ArangoDBClient\DocumentHandler::store() - - Store a document to a collection - This is an alias/shortcut to save() and replace(). Instead of having to determine which of the 3 functions to use, -simply pass the document to store() and it will figure out which one to call. - -This will throw if the document cannot be saved or replaced. - - \ArangoDBClient\Exception - - - \ArangoDBClient\Document + + __clone + \ArangoDBClient\Document::__clone() + + Clone a document + Returns the clone + + + void - - mixed + + \ArangoDBClient\Document + + + __toString + \ArangoDBClient\Document::__toString() + + Get a string representation of the document. + It will not output hidden attributes. + +Returns the document as JSON-encoded string + + + string - + + \ArangoDBClient\Document + + + toJson + \ArangoDBClient\Document::toJson() + + Returns the document as JSON-encoded string + + array - - mixed + + string - - - $document - - \ArangoDBClient\Document - - - $collection - null - mixed - $options array() array + \ArangoDBClient\Document - - save - \ArangoDBClient\DocumentHandler::save() - - save a document to a collection - This will add the document to the collection and return the document's id - -This will throw if the document cannot be saved - - \ArangoDBClient\Exception - - - mixed - - - \ArangoDBClient\Document - array - - + + toSerialized + \ArangoDBClient\Document::toSerialized() + + Returns the document as a serialized string + + array - - mixed + + string - - - $collection - - mixed - - - $document - - \ArangoDBClient\Document|array - $options array() array + \ArangoDBClient\Document - - insert - \ArangoDBClient\DocumentHandler::insert() - - Insert a document into a collection - This is an alias for save(). + + filterHiddenAttributes + \ArangoDBClient\Document::filterHiddenAttributes() + + Returns the attributes with the hidden ones removed + + + array + + + array + + + array + - $collection - - - - - $document + $attributes - + array - $options + $_hiddenAttributes array() array + \ArangoDBClient\Document - - update - \ArangoDBClient\DocumentHandler::update() - - Update an existing document in a collection, identified by the including _id and optionally _rev in the patch document. - Attention - The behavior of this method has changed since version 1.1 - -This will update the document on the server - -This will throw if the document cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the document to-be-replaced is the same as the one given. - - \ArangoDBClient\Exception + + set + \ArangoDBClient\Document::set() + + Set a document attribute + The key (attribute name) must be a string. +This will validate the value of the attribute and might throw an +exception if the value is invalid. + + \ArangoDBClient\ClientException - - \ArangoDBClient\Document + + string - - array + + mixed - - boolean + + void - $document + $key - \ArangoDBClient\Document + string - $options - array() - array + $value + + mixed + \ArangoDBClient\Document - - updateById - \ArangoDBClient\DocumentHandler::updateById() - - Update an existing document in a collection, identified by collection id and document id -Attention - The behavior of this method has changed since version 1.1 - This will update the document on the server - -This will throw if the document cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the document to-be-updated is the same as the one given. - - \ArangoDBClient\Exception + + __set + \ArangoDBClient\Document::__set() + + Set a document attribute, magic method + This is a magic method that allows the object to be used without +declaring all document attributes first. +This function is mapped to set() internally. + + \ArangoDBClient\ClientException - + + string - + mixed - - \ArangoDBClient\Document - - - array - - - boolean + + void - $collection + $key string - $documentId + $value mixed - - $document - - \ArangoDBClient\Document - - - $options - array() - array - + \ArangoDBClient\Document - - replace - \ArangoDBClient\DocumentHandler::replace() - - Replace an existing document in a collection, identified by the document itself - This will update the document on the server - -This will throw if the document cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the to-be-replaced document is the same as the one given. - - \ArangoDBClient\Exception - - - \ArangoDBClient\Document - - - array + + get + \ArangoDBClient\Document::get() + + Get a document attribute + + + string - - boolean + + mixed - $document + $key - \ArangoDBClient\Document - - - $options - array() - array + string + \ArangoDBClient\Document - - replaceById - \ArangoDBClient\DocumentHandler::replaceById() - - Replace an existing document in a collection, identified by collection id and document id - This will update the document on the server - -This will throw if the document cannot be Replaced - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the to-be-replaced document is the same as the one given. - - \ArangoDBClient\Exception - - - mixed + + __get + \ArangoDBClient\Document::__get() + + Get a document attribute, magic method + This function is mapped to get() internally. + + + string - + mixed - - \ArangoDBClient\Document - - - array - - - boolean - - $collection - - mixed - - - $documentId - - mixed - - - $document + $key - \ArangoDBClient\Document - - - $options - array() - array + string + \ArangoDBClient\Document - - remove - \ArangoDBClient\DocumentHandler::remove() - - Remove a document from a collection, identified by the document itself + + __isset + \ArangoDBClient\Document::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. - - \ArangoDBClient\Exception - - - \ArangoDBClient\Document - - - array + + string - + boolean - $document + $key - \ArangoDBClient\Document + string + \ArangoDBClient\Document + + + __unset + \ArangoDBClient\Document::__unset() + + Magic method to unset an attribute. + Caution!!! This works only on the first array level. +The preferred method to unset attributes in the database, is to set those to null and do an update() with the option: 'keepNull' => false. + + + - $options - array() - array + $key + + + \ArangoDBClient\Document - - removeById - \ArangoDBClient\DocumentHandler::removeById() - - Remove a document from a collection, identified by the collection id and document id + + getAll + \ArangoDBClient\Document::getAll() + + Get all document attributes - - \ArangoDBClient\Exception - - - mixed - - - mixed - - + mixed - + array - - boolean - - - $collection - - mixed - - - $documentId - - mixed - - - $revision - null - mixed - $options array() - array + mixed + \ArangoDBClient\Document - - getDocumentId - \ArangoDBClient\DocumentHandler::getDocumentId() - - Helper function to get a document id from a document or a document id value + + getAllForInsertUpdate + \ArangoDBClient\Document::getAllForInsertUpdate() + + Get all document attributes for insertion/update - - \ArangoDBClient\ClientException - - - mixed - - + mixed - - $document - - mixed - + \ArangoDBClient\Document - - getRevision - \ArangoDBClient\DocumentHandler::getRevision() - - Helper function to get a document id from a document or a document id value + + getAllAsObject + \ArangoDBClient\Document::getAllAsObject() + + Get all document attributes, and return an empty object if the documentapped into a DocumentWrapper class - - \ArangoDBClient\ClientException - - + mixed - + mixed - $document - + $options + array() mixed + \ArangoDBClient\Document - - createCollectionIfOptions - \ArangoDBClient\DocumentHandler::createCollectionIfOptions() - - + + setHiddenAttributes + \ArangoDBClient\Document::setHiddenAttributes() + + Set the hidden attributes +$cursor - - + array + + void + - $collection - - - - - $options + $attributes array + \ArangoDBClient\Document - - __construct - \ArangoDBClient\Handler::__construct() - - Construct a new handler + + getHiddenAttributes + \ArangoDBClient\Document::getHiddenAttributes() + + Get the hidden attributes - - \ArangoDBClient\Connection + + array - - $connection - - \ArangoDBClient\Connection - - \ArangoDBClient\Handler + \ArangoDBClient\Document - - getConnection - \ArangoDBClient\Handler::getConnection() - - Return the connection object + + isIgnoreHiddenAttributes + \ArangoDBClient\Document::isIgnoreHiddenAttributes() + + - - \ArangoDBClient\Connection + + boolean - \ArangoDBClient\Handler + \ArangoDBClient\Document - - getConnectionOption - \ArangoDBClient\Handler::getConnectionOption() - - Return a connection option -This is a convenience function that calls json_encode_wrapper on the connection + + setIgnoreHiddenAttributes + \ArangoDBClient\Document::setIgnoreHiddenAttributes() + + - - - mixed - - - \ArangoDBClient\ClientException + + boolean - $optionName + $ignoreHiddenAttributes - + boolean - \ArangoDBClient\Handler + \ArangoDBClient\Document - - json_encode_wrapper - \ArangoDBClient\Handler::json_encode_wrapper() - - Return a json encoded string for the array passed. - This is a convenience function that calls json_encode_wrapper on the connection - - array - - - string + + setChanged + \ArangoDBClient\Document::setChanged() + + Set the changed flag + + + boolean - - \ArangoDBClient\ClientException + + boolean - $body + $value - array + boolean - \ArangoDBClient\Handler + \ArangoDBClient\Document - - includeOptionsInBody - \ArangoDBClient\Handler::includeOptionsInBody() - - Helper function that runs through the options given and includes them into the parameters array given. - Only options that are set in $includeArray will be included. -This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - - array - - - array + + getChanged + \ArangoDBClient\Document::getChanged() + + Get the changed flag + + + boolean - - array + + \ArangoDBClient\Document + + + setIsNew + \ArangoDBClient\Document::setIsNew() + + Set the isNew flag + + + boolean - - array + + void - $options - - array - - - $body + $isNew - array - - - $includeArray - array() - array + boolean - \ArangoDBClient\Handler + \ArangoDBClient\Document - - makeCollection - \ArangoDBClient\Handler::makeCollection() - - Turn a value into a collection name + + getIsNew + \ArangoDBClient\Document::getIsNew() + + Get the isNew flag - - \ArangoDBClient\ClientException + + boolean - - mixed + + \ArangoDBClient\Document + + + setInternalId + \ArangoDBClient\Document::setInternalId() + + Set the internal document id + This will throw if the id of an existing document gets updated to some other id + + \ArangoDBClient\ClientException - + string + + void + - $value + $id - mixed + string - \ArangoDBClient\Handler + \ArangoDBClient\Document - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use - - + + setInternalKey + \ArangoDBClient\Document::setInternalKey() + + Set the internal document key + This will throw if the key of an existing document gets updated to some other key + + \ArangoDBClient\ClientException + + string - - \ArangoDBClient\DocumentClassable + + void - $class + $key string - \ArangoDBClient\DocumentClassable + \ArangoDBClient\Document - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use - - + + getInternalId + \ArangoDBClient\Document::getInternalId() + + Get the internal document id (if already known) + Document ids are generated on the server only. Document ids consist of collection id and +document id, in the format collectionId/documentId + string - - \ArangoDBClient\DocumentClassable - - - $class - - string - - \ArangoDBClient\DocumentClassable + \ArangoDBClient\Document - - - Name of argument $revision does not match with the DocBlock's name $ifMatch in getHead() - The type hint of the argument is incorrect for the type definition of the @param tag with argument $revision in getHead() - Name of argument $ifMatch does not match with the DocBlock's name $revision in getHead() - The type hint of the argument is incorrect for the type definition of the @param tag with argument $ifMatch in getHead() - Argument $collection is missing from the Docblock of insert - Argument $document is missing from the Docblock of insert - Argument $options is missing from the Docblock of insert - No summary for method createCollectionIfOptions() - - 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 - - - - ArangoDB PHP client: single document - - - - - - - \ArangoDBClient\Document - Edge - \ArangoDBClient\Edge - - Value object representing a single collection-based edge document - <br> - - - - - - ENTRY_FROM - \ArangoDBClient\Edge::ENTRY_FROM - '_from' - - Document _from index + + getInternalKey + \ArangoDBClient\Document::getInternalKey() + + Get the internal document key (if already known) + + string + - - - ENTRY_TO - \ArangoDBClient\Edge::ENTRY_TO - '_to' - - Revision _to index - - - - - ENTRY_ID - \ArangoDBClient\Document::ENTRY_ID - '_id' - - Document id index - - - - - ENTRY_KEY - \ArangoDBClient\Document::ENTRY_KEY - '_key' - - Document key index - - - - - ENTRY_REV - \ArangoDBClient\Document::ENTRY_REV - '_rev' - - Revision id index - - - - - ENTRY_ISNEW - \ArangoDBClient\Document::ENTRY_ISNEW - '_isNew' - - isNew id index - - - - - ENTRY_HIDDENATTRIBUTES - \ArangoDBClient\Document::ENTRY_HIDDENATTRIBUTES - '_hiddenAttributes' - - hidden attribute index - + \ArangoDBClient\Document + + + getHandle + \ArangoDBClient\Document::getHandle() + + Convenience function to get the document handle (if already known) - is an alias to getInternalId() + Document handles are generated on the server only. Document handles consist of collection id and +document id, in the format collectionId/documentId + + string + - - - ENTRY_IGNOREHIDDENATTRIBUTES - \ArangoDBClient\Document::ENTRY_IGNOREHIDDENATTRIBUTES - '_ignoreHiddenAttributes' - - hidden attribute index - + \ArangoDBClient\Document + + + getId + \ArangoDBClient\Document::getId() + + Get the document id (or document handle) if already known. + It is a string and consists of the collection's name and the document key (_key attribute) separated by /. +Example: (collectionname/documentId) + +The document handle is stored in a document's _id attribute. + + mixed + - - - OPTION_WAIT_FOR_SYNC - \ArangoDBClient\Document::OPTION_WAIT_FOR_SYNC - 'waitForSync' - - waitForSync option index - + \ArangoDBClient\Document + + + getKey + \ArangoDBClient\Document::getKey() + + Get the document key (if already known). + Alias function for getInternalKey() + + mixed + - - - OPTION_POLICY - \ArangoDBClient\Document::OPTION_POLICY - 'policy' - - policy option index - + \ArangoDBClient\Document + + + getCollectionId + \ArangoDBClient\Document::getCollectionId() + + Get the collection id (if already known) + Collection ids are generated on the server only. Collection ids are numeric but might be +bigger than PHP_INT_MAX. To reliably store a collection id elsewhere, a PHP string should be used + + mixed + - - - OPTION_KEEPNULL - \ArangoDBClient\Document::OPTION_KEEPNULL - 'keepNull' - - keepNull option index - + \ArangoDBClient\Document + + + setRevision + \ArangoDBClient\Document::setRevision() + + Set the document revision + Revision ids are generated on the server only. + +Document ids are strings, even if they look "numeric" +To reliably store a document id elsewhere, a PHP string must be used + + mixed + + + void + - - - $_from - \ArangoDBClient\Edge::_from - - - The edge's from (might be NULL for new documents) + + $rev + + mixed + + \ArangoDBClient\Document + + + getRevision + \ArangoDBClient\Document::getRevision() + + Get the document revision (if already known) - + mixed - - - $_to - \ArangoDBClient\Edge::_to - - - The edge's to (might be NULL for new documents) + \ArangoDBClient\Document + + + jsonSerialize + \ArangoDBClient\Document::jsonSerialize() + + Get all document attributes +Alias function for getAll() - it's necessary for implementing JsonSerializable interface - + mixed + + array + - - - $_id - \ArangoDBClient\Document::_id - - - The document id (might be NULL for new documents) - - + + $options + array() + mixed + + \ArangoDBClient\Document + + + + + + user + + + string + + + string - - $_key - \ArangoDBClient\Document::_key - - - The document key (might be NULL for new documents) - - - string + + + + + passwd + + + mixed|null + + + + mixed + null - - $_rev - \ArangoDBClient\Document::_rev - - - The document revision (might be NULL for new documents) - - + + + + + active + + + mixed|null + + + mixed + null - - $_values - \ArangoDBClient\Document::_values - array() - - The document attributes (names/values) - - + + + + + extra + + + array|null + + + array + null - - $_changed - \ArangoDBClient\Document::_changed - false - - Flag to indicate whether document was changed locally + + eJyFkM1OwzAQhO9+ir0VIkQFxxSJvwpxQeoFTpHQ1lmloY5trW1oBLw764RWKgXh436zszO+uPQrr9S0KBQUcM1oGze/gcX9ArRpycYSQmsbQ5ACMdROp06mIs76K496jQ0B7FZvh60BYoorx8LgTuAaHrAnHohY6rwEcHZ6LpOpUhY7CmJHP5xmu3BPaBKBW76QjsDkmYJwCQe4zfj4a0Z2njj2ECJndX65zD7s2g3VHzYZAx5DeKv/xKhj+0r7GJmxHzFtIuP/n3P4BdrI3bGCeJCtA8y3Vd6V+lSj4hlNi+Eo68pymJzApJJqcsqG6vvUssqCyfFMfQHFdZsR + + + + ArangoDB PHP client: collection handler + + + + + + + \ArangoDBClient\Handler + CollectionHandler + \ArangoDBClient\CollectionHandler + + Provides management of collections + The collection handler fetches collection data from the server and +creates collections on the server. + + + + + + ENTRY_DOCUMENTS + \ArangoDBClient\CollectionHandler::ENTRY_DOCUMENTS + 'documents' + + documents array index - - boolean - - - - $_isNew - \ArangoDBClient\Document::_isNew - true - - Flag to indicate whether document is a new document (never been saved to the server) + + + OPTION_COLLECTION + \ArangoDBClient\CollectionHandler::OPTION_COLLECTION + 'collection' + + collection parameter - - boolean - - - - $_doValidate - \ArangoDBClient\Document::_doValidate - false - - Flag to indicate whether validation of document values should be performed -This can be turned on, but has a performance penalty + + + OPTION_EXAMPLE + \ArangoDBClient\CollectionHandler::OPTION_EXAMPLE + 'example' + + example parameter - - boolean - - - - $_hiddenAttributes - \ArangoDBClient\Document::_hiddenAttributes - array() - - An array, that defines which attributes should be treated as hidden. + + + OPTION_NEW_VALUE + \ArangoDBClient\CollectionHandler::OPTION_NEW_VALUE + 'newValue' + + example parameter - - array - - - - $_ignoreHiddenAttributes - \ArangoDBClient\Document::_ignoreHiddenAttributes - false - - Flag to indicate whether hidden attributes should be ignored or included in returned data-sets + + + OPTION_CREATE_COLLECTION + \ArangoDBClient\CollectionHandler::OPTION_CREATE_COLLECTION + 'createCollection' + + example parameter - - boolean - - - - set - \ArangoDBClient\Edge::set() - - Set a document attribute - The key (attribute name) must be a string. - -This will validate the value of the attribute and might throw an -exception if the value is invalid. - - \ArangoDBClient\ClientException - - - string - - - mixed - - - void - - + + + OPTION_ATTRIBUTE + \ArangoDBClient\CollectionHandler::OPTION_ATTRIBUTE + 'attribute' + + attribute parameter + - - $key - - string - - - $value - - mixed - - - - setFrom - \ArangoDBClient\Edge::setFrom() - - Set the 'from' vertex document-handler + + + OPTION_KEYS + \ArangoDBClient\CollectionHandler::OPTION_KEYS + 'keys' + + keys parameter - - mixed - - - \ArangoDBClient\Edge - - - $from - - mixed - - - - getFrom - \ArangoDBClient\Edge::getFrom() - - Get the 'from' vertex document-handler (if already known) + + + OPTION_STREAM + \ArangoDBClient\CollectionHandler::OPTION_STREAM + 'stream' + + stream parameter - - mixed - - - - setTo - \ArangoDBClient\Edge::setTo() - - Set the 'to' vertex document-handler + + + OPTION_LEFT + \ArangoDBClient\CollectionHandler::OPTION_LEFT + 'left' + + left parameter - - mixed - - - \ArangoDBClient\Edge - - - $to - - mixed - - - - getTo - \ArangoDBClient\Edge::getTo() - - Get the 'to' vertex document-handler (if already known) + + + OPTION_RIGHT + \ArangoDBClient\CollectionHandler::OPTION_RIGHT + 'right' + + right parameter - - mixed - - - - getAllForInsertUpdate - \ArangoDBClient\Edge::getAllForInsertUpdate() - - Get all document attributes for insertion/update + + + OPTION_CLOSED + \ArangoDBClient\CollectionHandler::OPTION_CLOSED + 'closed' + + closed parameter - - mixed - - - - - __construct - \ArangoDBClient\Document::__construct() - - Constructs an empty document + + + OPTION_LATITUDE + \ArangoDBClient\CollectionHandler::OPTION_LATITUDE + 'latitude' + + latitude parameter - - array - - - $options - null - array - - \ArangoDBClient\Document - - - createFromArray - \ArangoDBClient\Document::createFromArray() - - Factory method to construct a new document using the values passed to populate it + + + OPTION_LONGITUDE + \ArangoDBClient\CollectionHandler::OPTION_LONGITUDE + 'longitude' + + longitude parameter - - \ArangoDBClient\ClientException - - - array - - - array - - - \ArangoDBClient\Document - \ArangoDBClient\Edge - \ArangoDBClient\Graph - - - - $values - - array - - - $options - array() - array - - \ArangoDBClient\Document - - - __clone - \ArangoDBClient\Document::__clone() - - Clone a document - Returns the clone - - - void - - \ArangoDBClient\Document - - - __toString - \ArangoDBClient\Document::__toString() - - Get a string representation of the document. - It will not output hidden attributes. - -Returns the document as JSON-encoded string - - - string - + + + OPTION_DISTANCE + \ArangoDBClient\CollectionHandler::OPTION_DISTANCE + 'distance' + + distance parameter + - \ArangoDBClient\Document - - - toJson - \ArangoDBClient\Document::toJson() - - Returns the document as JSON-encoded string + + + OPTION_RADIUS + \ArangoDBClient\CollectionHandler::OPTION_RADIUS + 'radius' + + radius parameter - - array - - - string - - - $options - array() - array - - \ArangoDBClient\Document - - - toSerialized - \ArangoDBClient\Document::toSerialized() - - Returns the document as a serialized string + + + OPTION_SKIP + \ArangoDBClient\CollectionHandler::OPTION_SKIP + 'skip' + + skip parameter - - array - - - string - - - $options - array() - array - - \ArangoDBClient\Document - - - filterHiddenAttributes - \ArangoDBClient\Document::filterHiddenAttributes() - - Returns the attributes with the hidden ones removed + + + OPTION_INDEX + \ArangoDBClient\CollectionHandler::OPTION_INDEX + 'index' + + index parameter - - array - - - array - - - array - - - $attributes - - array - - - $_hiddenAttributes - array() - array - - \ArangoDBClient\Document - - - set - \ArangoDBClient\Document::set() - - Set a document attribute - The key (attribute name) must be a string. -This will validate the value of the attribute and might throw an -exception if the value is invalid. - - \ArangoDBClient\ClientException - - - string - - - mixed - - - void - + + + OPTION_LIMIT + \ArangoDBClient\CollectionHandler::OPTION_LIMIT + 'limit' + + limit parameter + - - $key - - string - - - $value - - mixed - - \ArangoDBClient\Document - - - __set - \ArangoDBClient\Document::__set() - - Set a document attribute, magic method - This is a magic method that allows the object to be used without -declaring all document attributes first. -This function is mapped to set() internally. - - \ArangoDBClient\ClientException - - - - string - - - mixed - - - void - + + + OPTION_FIELDS + \ArangoDBClient\CollectionHandler::OPTION_FIELDS + 'fields' + + fields + - - $key - - string - - - $value - - mixed - - \ArangoDBClient\Document - - - get - \ArangoDBClient\Document::get() - - Get a document attribute + + + OPTION_UNIQUE + \ArangoDBClient\CollectionHandler::OPTION_UNIQUE + 'unique' + + unique - - string - - - mixed - - - $key - - string - - \ArangoDBClient\Document - - - __get - \ArangoDBClient\Document::__get() - - Get a document attribute, magic method - This function is mapped to get() internally. - - - string - - - mixed - + + + OPTION_TYPE + \ArangoDBClient\CollectionHandler::OPTION_TYPE + 'type' + + type + - - $key - - string - - \ArangoDBClient\Document - - - __isset - \ArangoDBClient\Document::__isset() - - Is triggered by calling isset() or empty() on inaccessible properties. + + + OPTION_SIZE + \ArangoDBClient\CollectionHandler::OPTION_SIZE + 'size' + + size option - - string - - - boolean - - - $key - - string - - \ArangoDBClient\Document - - - __unset - \ArangoDBClient\Document::__unset() - - Magic method to unset an attribute. - Caution!!! This works only on the first array level. -The preferred method to unset attributes in the database, is to set those to null and do an update() with the option: 'keepNull' => false. - - + + + OPTION_GEO_INDEX + \ArangoDBClient\CollectionHandler::OPTION_GEO_INDEX + 'geo' + + geo index option + - - $key - - - - \ArangoDBClient\Document - - - getAll - \ArangoDBClient\Document::getAll() - - Get all document attributes + + + OPTION_GEOJSON + \ArangoDBClient\CollectionHandler::OPTION_GEOJSON + 'geoJson' + + geoJson option - - mixed - - - array - - - $options - array() - mixed - - \ArangoDBClient\Document - - - getAllForInsertUpdate - \ArangoDBClient\Document::getAllForInsertUpdate() - - Get all document attributes for insertion/update + + + OPTION_HASH_INDEX + \ArangoDBClient\CollectionHandler::OPTION_HASH_INDEX + 'hash' + + hash index option - - mixed - - \ArangoDBClient\Document - - - getAllAsObject - \ArangoDBClient\Document::getAllAsObject() - - Get all document attributes, and return an empty object if the documentapped into a DocumentWrapper class + + + OPTION_FULLTEXT_INDEX + \ArangoDBClient\CollectionHandler::OPTION_FULLTEXT_INDEX + 'fulltext' + + fulltext index option - - mixed - - - mixed - - - $options - array() - mixed - - \ArangoDBClient\Document - - - setHiddenAttributes - \ArangoDBClient\Document::setHiddenAttributes() - - Set the hidden attributes -$cursor + + + OPTION_MIN_LENGTH + \ArangoDBClient\CollectionHandler::OPTION_MIN_LENGTH + 'minLength' + + minLength option - - array - - - void - - - $attributes - - array - - \ArangoDBClient\Document - - - getHiddenAttributes - \ArangoDBClient\Document::getHiddenAttributes() - - Get the hidden attributes + + + OPTION_SKIPLIST_INDEX + \ArangoDBClient\CollectionHandler::OPTION_SKIPLIST_INDEX + 'skiplist' + + skiplist index option - - array - - \ArangoDBClient\Document - - - isIgnoreHiddenAttributes - \ArangoDBClient\Document::isIgnoreHiddenAttributes() - - + + + OPTION_PERSISTENT_INDEX + \ArangoDBClient\CollectionHandler::OPTION_PERSISTENT_INDEX + 'persistent' + + persistent index option - - boolean - - \ArangoDBClient\Document - - - setIgnoreHiddenAttributes - \ArangoDBClient\Document::setIgnoreHiddenAttributes() - - + + + OPTION_TTL_INDEX + \ArangoDBClient\CollectionHandler::OPTION_TTL_INDEX + 'ttl' + + ttl index option - - boolean - - - $ignoreHiddenAttributes - - boolean - - \ArangoDBClient\Document - - - setChanged - \ArangoDBClient\Document::setChanged() - - Set the changed flag + + + OPTION_EXPIRE_AFTER + \ArangoDBClient\CollectionHandler::OPTION_EXPIRE_AFTER + 'expireAfter' + + expireAfter option - - boolean - - - boolean - - - $value - - boolean - - \ArangoDBClient\Document - - - getChanged - \ArangoDBClient\Document::getChanged() - - Get the changed flag + + + OPTION_IN_BACKGROUND + \ArangoDBClient\CollectionHandler::OPTION_IN_BACKGROUND + 'inBackground' + + inBackground option - - boolean - - \ArangoDBClient\Document - - - setIsNew - \ArangoDBClient\Document::setIsNew() - - Set the isNew flag + + + OPTION_SPARSE + \ArangoDBClient\CollectionHandler::OPTION_SPARSE + 'sparse' + + sparse index option - - boolean - - - void - - - $isNew - - boolean - - \ArangoDBClient\Document - - - getIsNew - \ArangoDBClient\Document::getIsNew() - - Get the isNew flag + + + OPTION_COUNT + \ArangoDBClient\CollectionHandler::OPTION_COUNT + 'count' + + count option - - boolean - - \ArangoDBClient\Document - - - setInternalId - \ArangoDBClient\Document::setInternalId() - - Set the internal document id - This will throw if the id of an existing document gets updated to some other id - - \ArangoDBClient\ClientException - - - string - - - void - + + + OPTION_QUERY + \ArangoDBClient\CollectionHandler::OPTION_QUERY + 'query' + + query option + - - $id - - string - - \ArangoDBClient\Document - - - setInternalKey - \ArangoDBClient\Document::setInternalKey() - - Set the internal document key - This will throw if the key of an existing document gets updated to some other key - - \ArangoDBClient\ClientException - - - string - - - void - + + + OPTION_CHECKSUM + \ArangoDBClient\CollectionHandler::OPTION_CHECKSUM + 'checksum' + + checksum option + - - $key - - string - - \ArangoDBClient\Document - - - getInternalId - \ArangoDBClient\Document::getInternalId() - - Get the internal document id (if already known) - Document ids are generated on the server only. Document ids consist of collection id and -document id, in the format collectionId/documentId - - string + + + OPTION_REVISION + \ArangoDBClient\CollectionHandler::OPTION_REVISION + 'revision' + + revision option + + + + + OPTION_RESPONSIBLE_SHARD + \ArangoDBClient\CollectionHandler::OPTION_RESPONSIBLE_SHARD + 'responsibleShard' + + responsible shard option + + + + + OPTION_SHARDS + \ArangoDBClient\CollectionHandler::OPTION_SHARDS + 'shards' + + shards option + + + + + OPTION_PROPERTIES + \ArangoDBClient\CollectionHandler::OPTION_PROPERTIES + 'properties' + + properties option + + + + + OPTION_FIGURES + \ArangoDBClient\CollectionHandler::OPTION_FIGURES + 'figures' + + figures option + + + + + OPTION_LOAD + \ArangoDBClient\CollectionHandler::OPTION_LOAD + 'load' + + load option + + + + + OPTION_UNLOAD + \ArangoDBClient\CollectionHandler::OPTION_UNLOAD + 'unload' + + unload option + + + + + OPTION_TRUNCATE + \ArangoDBClient\CollectionHandler::OPTION_TRUNCATE + 'truncate' + + truncate option + + + + + OPTION_RENAME + \ArangoDBClient\CollectionHandler::OPTION_RENAME + 'rename' + + rename option + + + + + OPTION_EXCLUDE_SYSTEM + \ArangoDBClient\CollectionHandler::OPTION_EXCLUDE_SYSTEM + 'excludeSystem' + + exclude system collections + + + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object + + + \ArangoDBClient\Connection - \ArangoDBClient\Document - - - getInternalKey - \ArangoDBClient\Document::getInternalKey() - - Get the internal document key (if already known) + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + - + string - \ArangoDBClient\Document - - - getHandle - \ArangoDBClient\Document::getHandle() - - Convenience function to get the document handle (if already known) - is an alias to getInternalId() - Document handles are generated on the server only. Document handles consist of collection id and -document id, in the format collectionId/documentId - + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + string - \ArangoDBClient\Document - - - getId - \ArangoDBClient\Document::getId() - - Get the document id (or document handle) if already known. - It is a string and consists of the collection's name and the document key (_key attribute) separated by /. -Example: (collectionname/documentId) - -The document handle is stored in a document's _id attribute. - + + + create + \ArangoDBClient\CollectionHandler::create() + + Creates a new collection on the server + This will add the collection on the server and return its id +The id is mainly returned for backwards compatibility, but you should use the collection name for any reference to the collection. * +This will throw if the collection cannot be created + + \ArangoDBClient\Exception + + mixed - - \ArangoDBClient\Document - - - getKey - \ArangoDBClient\Document::getKey() - - Get the document key (if already known). - Alias function for getInternalKey() - + + array + + mixed - \ArangoDBClient\Document + + $collection + + mixed + + + $options + array() + array + - - getCollectionId - \ArangoDBClient\Document::getCollectionId() - - Get the collection id (if already known) - Collection ids are generated on the server only. Collection ids are numeric but might be -bigger than PHP_INT_MAX. To reliably store a collection id elsewhere, a PHP string should be used - + + has + \ArangoDBClient\CollectionHandler::has() + + Check if a collection exists + This will call self::get() internally and checks if there +was an exception thrown which represents an 404 request. + + \ArangoDBClient\Exception + + mixed + + boolean + - \ArangoDBClient\Document + + $collection + + mixed + - - setRevision - \ArangoDBClient\Document::setRevision() - - Set the document revision - Revision ids are generated on the server only. - -Document ids are strings, even if they look "numeric" -To reliably store a document id elsewhere, a PHP string must be used - + + count + \ArangoDBClient\CollectionHandler::count() + + Get the number of documents in a collection + This will throw if the collection cannot be fetched from the server + + \ArangoDBClient\Exception + + mixed - - void + + integer - $rev + $collection mixed - \ArangoDBClient\Document - - getRevision - \ArangoDBClient\Document::getRevision() - - Get the document revision (if already known) - - + + get + \ArangoDBClient\CollectionHandler::get() + + Get information about a collection + This will throw if the collection cannot be fetched from the server + + \ArangoDBClient\Exception + + mixed + + \ArangoDBClient\Collection + - \ArangoDBClient\Document + + $collection + + mixed + - - jsonSerialize - \ArangoDBClient\Document::jsonSerialize() - - Get all document attributes -Alias function for getAll() - it's necessary for implementing JsonSerializable interface - - + + getProperties + \ArangoDBClient\CollectionHandler::getProperties() + + Get properties of a collection + This will throw if the collection cannot be fetched from the server + + \ArangoDBClient\Exception + + mixed - - array + + \ArangoDBClient\Collection - $options - array() + $collection + mixed - \ArangoDBClient\Document - - eJy1V2FvGjkQ/c6vmEhIkAhK2o+k9NJrSJq211QpjVQlUWR2B/DF2CvbS0DX/Pcbe70bsrCBq45VpMB6/Oa9mfF4ePtHMklqtc7BQQ0O4L1mcqxO/oRvH79BJDhK2wXD5VggxCpKp/SC7JzpccKiezZGgGLXB7/BL7LUTpSmNfjEJHy3iFMmpV+KVLLQfDyx8KH49Obw9ZsWWM0JUBo4mw4/tmhZqLHEFpyhpt0L2t2p1SSboiHfWHJ7VIi4YiJFUMO/MbKgMdFoaJ1EAMu1REoIWuVKtofMYAwYj1cUvh3qd1uJJdDILQG8fnXoWUaCGQN9B4pzizI2cJKD/1Nzlp6rew5gMEHvv2FgpNUUmlMfkyHC1x9fvsCI4ijxoWBn9sPGfP/xjGmY8jnG4U3H/0+0sqSRxNXvHC4FqNqxVbtwa9Wq0zwO4EkBlzHOCwD/IVLSWOh/HVz+vDu9vPgLetDwxo1VtEuccUNpBPJVwipDDS48kFUOpozzHS1VR64VmKVaHKYWS5pdxO5xAc3CAFw97sM0NT50VGG0IMevVjZyAw9cCJgxwWNGGy1hzbJSHfkvT5hMxpBlw060eqDvOQ7OI0xc3QIfLSEQOJceuez42CMYyMq1n28vWyVMs2ngDnUnEaANz1WWjH3qAeoZg3Zg4sqmKnrHGm2qJcwUL9VMOhQ8glEq/ZkEg7bpSLQCelZ62cFxD2lv1i2FtP3uLlZXIaL7SxY+vZ11wU7oZOYlGx7fMAKK0t1uvqsZvB8V1o+15xyI4/XhLfR6rrIaZQK5iV83KEbdblaK5ydlU/cERST+XFrUkonz+InCinkWzKNn7x9r2xH43P+5HYPPuNgRhcv+1csU8qO9I/+us7xM4JRazo6cDy5edj1Q/9nxGgrO/V5+TqIJ3VsYr6vRPW78iQuW3rG5dsRv9+HXL1i3AHskKXBcI4XOHkFCcAojwcZVcnNm1J2tTnELXQTuOqShw7p0smtl3Gd0c7IZ/OP6G8BhNfxNAzPUFufFjdAmjrFAvb5vZq2w7i+0dnaJZ/srGqAfDNrZ0JHNKZvaYVaLDrncC3O13msvI7FUNMGjtyq0l6SfbSUdmlQrTGhk8QLupXqQKxNBcJaFo10VvPUix0FkWd+ygCCzSkeRQrrjfyuBNEO03Sj0PyfPnWarqhJH/nrO9e8m7QWxu08ZSduQMCesWgGjiWh16jJ+jODSkCxy1EkTdx1voE73uoo4s3xGA5TWbOHmqgr8TtYbNql7L8Sp0ueexw/PYUVtnd4yKJ4ezRfa/WrqVmx/am/LQ4w/vK6jylSIcj/1Lq7DCOw72cpZyAK8DpmqaxMuFdCtp15O2VLalhPrthU5pT//Y+eOZiZmmu5wdLv+TQsaN/kvupvwq2l44wwaFIV/AaDf7i0= - - - - ArangoDB PHP client: result set cursor - - - - - - - - \Iterator - Cursor - \ArangoDBClient\Cursor - - Provides access to the results of an AQL query or another statement - The cursor might not contain all results in the beginning.<br> - -If the result set is too big to be transferred in one go, the -cursor might issue additional HTTP requests to fetch the -remaining results from the server. - - - - - ENTRY_ID - \ArangoDBClient\Cursor::ENTRY_ID - 'id' - - result entry for cursor id - - - - - ENTRY_HASMORE - \ArangoDBClient\Cursor::ENTRY_HASMORE - 'hasMore' - - result entry for "hasMore" flag - - - - - ENTRY_RESULT - \ArangoDBClient\Cursor::ENTRY_RESULT - 'result' - - result entry for result documents - - - - - ENTRY_EXTRA - \ArangoDBClient\Cursor::ENTRY_EXTRA - 'extra' - - result entry for extra data - - - - - ENTRY_STATS - \ArangoDBClient\Cursor::ENTRY_STATS - 'stats' - - result entry for stats - - - - - FULL_COUNT - \ArangoDBClient\Cursor::FULL_COUNT - 'fullCount' - - result entry for the full count (ignoring the outermost LIMIT) - - - - - ENTRY_CACHE - \ArangoDBClient\Cursor::ENTRY_CACHE - 'cache' - - cache option entry - - - - - ENTRY_CACHED - \ArangoDBClient\Cursor::ENTRY_CACHED - 'cached' - - cached result attribute - whether or not the result was served from the AQL query cache - - - - - ENTRY_SANITIZE - \ArangoDBClient\Cursor::ENTRY_SANITIZE - '_sanitize' - - sanitize option entry - - - - - ENTRY_FLAT - \ArangoDBClient\Cursor::ENTRY_FLAT - '_flat' - - "flat" option entry (will treat the results as a simple array, not documents) - - - - - ENTRY_TYPE - \ArangoDBClient\Cursor::ENTRY_TYPE - 'objectType' - - "objectType" option entry. - - - - - ENTRY_BASEURL - \ArangoDBClient\Cursor::ENTRY_BASEURL - 'baseurl' - - "baseurl" option entry. - - - - - $_connection - \ArangoDBClient\Cursor::_connection - - - The connection object - - - \ArangoDBClient\Connection + + figures + \ArangoDBClient\CollectionHandler::figures() + + Get figures for a collection + This will throw if the collection cannot be fetched from the server + + \ArangoDBClient\Exception - - - - $_options - \ArangoDBClient\Cursor::_options - - - Cursor options - - + + mixed + + array - - - $data - \ArangoDBClient\Cursor::data - - - Result Data - - + + $collection + + mixed + + + + getChecksum + \ArangoDBClient\CollectionHandler::getChecksum() + + Calculate a checksum of the collection. + Will calculate a checksum of the meta-data (keys and optionally revision ids) +and optionally the document data in the collection. + + \ArangoDBClient\Exception + + + mixed + + + boolean + + + boolean + + array - - - $_result - \ArangoDBClient\Cursor::_result - - - The result set - - + + $collection + + mixed + + + $withRevisions + false + boolean + + + $withData + false + boolean + + + + getRevision + \ArangoDBClient\CollectionHandler::getRevision() + + Returns the Collections revision ID + The revision id is a server-generated string that clients can use to check whether data in a collection has +changed since the last revision check. + + \ArangoDBClient\Exception + + + mixed + + array - - - $_hasMore - \ArangoDBClient\Cursor::_hasMore - - - "has more" indicator - if true, the server has more results + + $collection + + mixed + + + + rename + \ArangoDBClient\CollectionHandler::rename() + + Rename a collection - - boolean + + \ArangoDBClient\Exception - - - - $_id - \ArangoDBClient\Cursor::_id - - - cursor id - might be NULL if cursor does not have an id - - + mixed - - - - $_position - \ArangoDBClient\Cursor::_position - - - current position in result set iteration (zero-based) - - - integer + + string - - - - $_length - \ArangoDBClient\Cursor::_length - - - total length of result set (in number of documents) - - - integer + + boolean - - - $_fullCount - \ArangoDBClient\Cursor::_fullCount - - - full count of the result set (ignoring the outermost LIMIT) - - - integer + + $collection + + mixed + + + $name + + string + + + + load + \ArangoDBClient\CollectionHandler::load() + + Load a collection into the server's memory + This will load the given collection into the server's memory. + + \ArangoDBClient\Exception - - - - $_extra - \ArangoDBClient\Cursor::_extra - - - extra data (statistics) returned from the statement - - - array + + mixed - - - - $_fetches - \ArangoDBClient\Cursor::_fetches - 1 - - number of HTTP calls that were made to build the cursor result - - - - - $_cached - \ArangoDBClient\Cursor::_cached - - - whether or not the query result was served from the AQL query result cache - - - - - $_count - \ArangoDBClient\Cursor::_count - - - precalculated number of documents in the cursor, as returned by the server - - - integer + + \ArangoDBClient\HttpResponse - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - - - - string + + $collection + + mixed + + + + unload + \ArangoDBClient\CollectionHandler::unload() + + Unload a collection from the server's memory + This will unload the given collection from the server's memory. + + \ArangoDBClient\Exception + + + mixed + + + \ArangoDBClient\HttpResponse - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - - - - string + + $collection + + mixed + + + + truncate + \ArangoDBClient\CollectionHandler::truncate() + + Truncate a collection + This will remove all documents from the collection but will leave the metadata and indexes intact. + + \ArangoDBClient\Exception + + + mixed + + + boolean - - - __construct - \ArangoDBClient\Cursor::__construct() - - Initialise the cursor with the first results and some metadata + + $collection + + mixed + + + + drop + \ArangoDBClient\CollectionHandler::drop() + + Drop a collection - - \ArangoDBClient\Connection + + \ArangoDBClient\Exception - - array + + mixed - + array - - \ArangoDBClient\ClientException + + boolean - $connection - - \ArangoDBClient\Connection - - - $data + $collection - array + mixed $options - + array() array - - delete - \ArangoDBClient\Cursor::delete() - - Explicitly delete the cursor - This might issue an HTTP DELETE request to inform the server about -the deletion. - - \ArangoDBClient\Exception - - + + isValidCollectionId + \ArangoDBClient\CollectionHandler::isValidCollectionId() + + Checks if the collectionId given, is valid. Returns true if it is, or false if it is not. + + + boolean + + $collectionId + + + - - getCount - \ArangoDBClient\Cursor::getCount() - - Get the total number of results in the cursor - This might issue additional HTTP requests to fetch any outstanding -results from the server - + + getAllCollections + \ArangoDBClient\CollectionHandler::getAllCollections() + + Get list of all available collections per default with the collection names as index. + Returns empty array if none are available. + + array + + + array + + \ArangoDBClient\Exception - - integer + + \ArangoDBClient\ClientException + + $options + array() + array + - - getFullCount - \ArangoDBClient\Cursor::getFullCount() - - Get the full count of the cursor (ignoring the outermost LIMIT) + + getCollectionId + \ArangoDBClient\CollectionHandler::getCollectionId() + + Gets the collectionId from the given collectionObject or string/integer - - integer + + mixed + + + mixed + + $collection + + mixed + - - getCached - \ArangoDBClient\Cursor::getCached() - - Get the cached attribute for the result set + + getCollectionName + \ArangoDBClient\CollectionHandler::getCollectionName() + + Gets the collectionId from the given collectionObject or string/integer - - boolean + + mixed + + + mixed + + $collection + + mixed + - - getAll - \ArangoDBClient\Cursor::getAll() - - Get all results as an array - This might issue additional HTTP requests to fetch any outstanding -results from the server - + + importFromFile + \ArangoDBClient\CollectionHandler::importFromFile() + + Import documents from a file + This will throw on all errors except insertion errors + \ArangoDBClient\Exception - - array + + mixed - - - - rewind - \ArangoDBClient\Cursor::rewind() - - Rewind the cursor, necessary for Iterator - - - void + + mixed - - - - current - \ArangoDBClient\Cursor::current() - - Return the current result row, necessary for Iterator - - + array - - - - key - \ArangoDBClient\Cursor::key() - - Return the index of the current result row, necessary for Iterator - - - integer - - - - - next - \ArangoDBClient\Cursor::next() - - Advance the cursor, necessary for Iterator - - - void + + array + + $collection + + + + + $importFileName + + mixed + + + $options + array() + array + - - valid - \ArangoDBClient\Cursor::valid() - - Check if cursor can be advanced further, necessary for Iterator - This might issue additional HTTP requests to fetch any outstanding -results from the server - - \ArangoDBClient\Exception + + import + \ArangoDBClient\CollectionHandler::import() + + Import documents into a collection + This will throw on all errors except insertion errors + + + string + array - - boolean + + array - - - - add - \ArangoDBClient\Cursor::add() - - Create an array of results from the input array - - + + array - - void + + \ArangoDBClient\Exception - + \ArangoDBClient\ClientException - $data + $collection - array + - - - addFlatFromArray - \ArangoDBClient\Cursor::addFlatFromArray() - - Create an array of results from the input array - - - array - - - void - - - $data + $importData + string|array + + + $options + array() array - - addDocumentsFromArray - \ArangoDBClient\Cursor::addDocumentsFromArray() - - Create an array of documents from the input array + + createHashIndex + \ArangoDBClient\CollectionHandler::createHashIndex() + + Create a hash index - + + mixed + + array - - void + + boolean - - \ArangoDBClient\ClientException + + boolean + + + boolean + + + + array + + + \ArangoDBClient\Exception - $data + $collection + + mixed + + + $fields array + + $unique + null + boolean + + + $sparse + null + boolean + + + $inBackground + false + boolean + - - addPathsFromArray - \ArangoDBClient\Cursor::addPathsFromArray() - - Create an array of paths from the input array + + createFulltextIndex + \ArangoDBClient\CollectionHandler::createFulltextIndex() + + Create a fulltext index - + + mixed + + array - - void + + integer - - \ArangoDBClient\ClientException + + boolean + + + + array + + + \ArangoDBClient\Exception - $data + $collection + + mixed + + + $fields array + + $minLength + null + integer + + + $inBackground + false + boolean + - - addShortestPathFromArray - \ArangoDBClient\Cursor::addShortestPathFromArray() - - Create an array of shortest paths from the input array + + createSkipListIndex + \ArangoDBClient\CollectionHandler::createSkipListIndex() + + Create a skip-list index - + + mixed + + array - - void + + boolean - - \ArangoDBClient\ClientException + + boolean - - - $data - - array - - - - addDistanceToFromArray - \ArangoDBClient\Cursor::addDistanceToFromArray() - - Create an array of distances from the input array - - + + boolean + + + array - - void + + \ArangoDBClient\Exception - $data + $collection - array + mixed - - - addCommonNeighborsFromArray - \ArangoDBClient\Cursor::addCommonNeighborsFromArray() - - Create an array of common neighbors from the input array - - - array - - - void - - - \ArangoDBClient\ClientException - - - $data + $fields array + + $unique + null + boolean + + + $sparse + null + boolean + + + $inBackground + false + boolean + - - addCommonPropertiesFromArray - \ArangoDBClient\Cursor::addCommonPropertiesFromArray() - - Create an array of common properties from the input array + + createPersistentIndex + \ArangoDBClient\CollectionHandler::createPersistentIndex() + + Create a persistent index - + + mixed + + array - - void + + boolean + + + boolean + + + boolean + + + + array + + + \ArangoDBClient\Exception - $data + $collection + + mixed + + + $fields array + + $unique + null + boolean + + + $sparse + null + boolean + + + $inBackground + false + boolean + - - addFigureFromArray - \ArangoDBClient\Cursor::addFigureFromArray() - - Create an array of figuresfrom the input array + + createTtlIndex + \ArangoDBClient\CollectionHandler::createTtlIndex() + + Create a TTL index - + + mixed + + array - - void + + \ArangoDBClient\number + + + boolean + + + + array + + + \ArangoDBClient\Exception - $data + $collection + + mixed + + + $fields array + + $expireAfter + + \ArangoDBClient\number + + + $inBackground + false + boolean + - - addEdgesFromArray - \ArangoDBClient\Cursor::addEdgesFromArray() - - Create an array of Edges from the input array + + createGeoIndex + \ArangoDBClient\CollectionHandler::createGeoIndex() + + Create a geo index - + + mixed + + array - - void + + boolean - - \ArangoDBClient\ClientException + + boolean + + + + array + + + \ArangoDBClient\Exception - $data + $collection + + mixed + + + $fields array + + $geoJson + null + boolean + + + $inBackground + false + boolean + - - addVerticesFromArray - \ArangoDBClient\Cursor::addVerticesFromArray() - - Create an array of Vertex from the input array - - + + index + \ArangoDBClient\CollectionHandler::index() + + Creates an index on a collection on the server + This will create an index on the collection on the server and return its id + +This will throw if the index cannot be created + + \ArangoDBClient\Exception + + + mixed + + + string + + array - - void + + boolean - - \ArangoDBClient\ClientException + + array + + + + array - $data + $collection + + mixed + + + $type + string + + + $attributes + array() + array + + + $unique + false + boolean + + + $indexOptions + array() array - - sanitize - \ArangoDBClient\Cursor::sanitize() - - Sanitize the result set rows - This will remove the _id and _rev attributes from the results if the -"sanitize" option is set - + + createIndex + \ArangoDBClient\CollectionHandler::createIndex() + + Creates an index on a collection on the server + This will create an index on the collection on the server and return its id + +This will throw if the index cannot be created + + \ArangoDBClient\Exception + + + mixed + + array - + array + - $rows + $collection + + mixed + + + $indexOptions array - - fetchOutstanding - \ArangoDBClient\Cursor::fetchOutstanding() - - Fetch outstanding results from the server + + getIndex + \ArangoDBClient\CollectionHandler::getIndex() + + Get the information about an index in a collection - - \ArangoDBClient\Exception + + string - - void + + string - - - - updateLength - \ArangoDBClient\Cursor::updateLength() - - Set the length of the (fetched) result set - - - void + + array - - - - url - \ArangoDBClient\Cursor::url() - - Return the base URL for the cursor - - - string - - - - - getStatValue - \ArangoDBClient\Cursor::getStatValue() - - Get a statistical figure value from the query result - - - string - - - integer + + \ArangoDBClient\Exception + + + \ArangoDBClient\ClientException - $name + $collection + + string + + + $indexId string - - getMetadata - \ArangoDBClient\Cursor::getMetadata() - - Get MetaData of the current cursor - - - array + + getIndexes + \ArangoDBClient\CollectionHandler::getIndexes() + + Get indexes of a collection + This will throw if the collection cannot be fetched from the server + + \ArangoDBClient\Exception - - - - getExtra - \ArangoDBClient\Cursor::getExtra() - - Return the extra data of the query (statistics etc.). Contents of the result array -depend on the type of query executed - - - array + + mixed - - - - getWarnings - \ArangoDBClient\Cursor::getWarnings() - - Return the warnings issued during query execution - - + array + + $collection + + mixed + - - getWritesExecuted - \ArangoDBClient\Cursor::getWritesExecuted() - - Return the number of writes executed by the query + + dropIndex + \ArangoDBClient\CollectionHandler::dropIndex() + + Drop an index - - integer + + \ArangoDBClient\Exception - - - - getWritesIgnored - \ArangoDBClient\Cursor::getWritesIgnored() - - Return the number of ignored write operations from the query - - - integer + + mixed - - - - getScannedFull - \ArangoDBClient\Cursor::getScannedFull() - - Return the number of documents iterated over in full scans - - - integer + + mixed - - - - getScannedIndex - \ArangoDBClient\Cursor::getScannedIndex() - - Return the number of documents iterated over in index scans - - - integer + + boolean + + $collection + + mixed + + + $indexHandle + null + mixed + - - getFiltered - \ArangoDBClient\Cursor::getFiltered() - - Return the number of documents filtered by the query + + getResponsibleShard + \ArangoDBClient\CollectionHandler::getResponsibleShard() + + Get the responsible shard for a document - - integer + + \ArangoDBClient\Exception - - - - getFetches - \ArangoDBClient\Cursor::getFetches() - - Return the number of HTTP calls that were made to build the cursor result - - - integer + + mixed - - - - getId - \ArangoDBClient\Cursor::getId() - - Return the cursor id, if any - - + + mixed + + string + + + $collection + + mixed + + + $document + + mixed + - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use + + getShards + \ArangoDBClient\CollectionHandler::getShards() + + Get the shards of a collection - - string + + \ArangoDBClient\Exception - - \ArangoDBClient\DocumentClassable + + mixed + + + array + - $class + $collection - string + mixed - \ArangoDBClient\DocumentClassable - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use - - - string + + any + \ArangoDBClient\CollectionHandler::any() + + Get a random document from the collection. + This will throw if the document cannot be fetched from the server + + \ArangoDBClient\Exception - - \ArangoDBClient\DocumentClassable + + mixed + + + \ArangoDBClient\Document + - $class + $collection - string + mixed - \ArangoDBClient\DocumentClassable - - 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 - - - - ArangoDB PHP client: single database - - - - - - - - Database - \ArangoDBClient\Database - - A class for managing ArangoDB Databases - This class provides functions to manage Databases through ArangoDB's Database API<br> - - - - - - ENTRY_DATABASE_NAME - \ArangoDBClient\Database::ENTRY_DATABASE_NAME - 'name' - - Databases index - - - - - ENTRY_DATABASE_USERS - \ArangoDBClient\Database::ENTRY_DATABASE_USERS - 'users' - - Users index + + all + \ArangoDBClient\CollectionHandler::all() + + Returns all documents of a collection - - - - create - \ArangoDBClient\Database::create() - - creates a database - This creates a new database<br> - - \ArangoDBClient\Connection - - - string + + mixed - - + array - + + \ArangoDBClient\Cursor + + \ArangoDBClient\Exception - + \ArangoDBClient\ClientException - $connection + $collection - \ArangoDBClient\Connection + mixed - $name - - string + $options + array() + array - - delete - \ArangoDBClient\Database::delete() - - Deletes a database - This will delete an existing database. - - \ArangoDBClient\Connection + + getAllIds + \ArangoDBClient\CollectionHandler::getAllIds() + + Get the list of all documents' ids from a collection + This will throw if the list cannot be fetched from the server + + \ArangoDBClient\Exception - - string + + mixed - - + array - + + + $collection + + mixed + + + + byExample + \ArangoDBClient\CollectionHandler::byExample() + + Get document(s) by specifying an example + This will throw if the list cannot be fetched from the server + \ArangoDBClient\Exception - - \ArangoDBClient\ClientException + + mixed + + + mixed + + + array + + + \ArangoDBClient\cursor - $connection + $collection - \ArangoDBClient\Connection + mixed - $name + $document - string + mixed + + + $options + array() + array - - listDatabases - \ArangoDBClient\Database::listDatabases() - - List databases - This will list the databases that exist on the server - - \ArangoDBClient\Connection + + firstExample + \ArangoDBClient\CollectionHandler::firstExample() + + Get the first document matching a given example. + This will throw if the document cannot be fetched from the server + + \ArangoDBClient\Exception - - - array + + mixed - - \ArangoDBClient\Exception + + mixed - - \ArangoDBClient\ClientException + + array + + + \ArangoDBClient\Document + - $connection + $collection - \ArangoDBClient\Connection + mixed + + + $document + + mixed + + + $options + array() + array - - databases - \ArangoDBClient\Database::databases() - - List databases - This will list the databases that exist on the server - - \ArangoDBClient\Connection + + fulltext + \ArangoDBClient\CollectionHandler::fulltext() + + Get document(s) by a fulltext query + This will find all documents from the collection that match the fulltext query specified in query. +In order to use the fulltext operator, a fulltext index must be defined for the collection and the specified attribute. + + \ArangoDBClient\Exception - - - array + + mixed - - \ArangoDBClient\Exception + + mixed - - \ArangoDBClient\ClientException + + mixed + + + array + + + + \ArangoDBClient\cursor - $connection + $collection - \ArangoDBClient\Connection + mixed + + + $attribute + + mixed + + + $query + + mixed + + + $options + array() + array - - listUserDatabases - \ArangoDBClient\Database::listUserDatabases() - - List user databases - Retrieves the list of all databases the current user can access without -specifying a different username or password. - - \ArangoDBClient\Connection + + updateByExample + \ArangoDBClient\CollectionHandler::updateByExample() + + Update document(s) matching a given example + This will update the document(s) on the server + +This will throw if the document cannot be updated + + \ArangoDBClient\Exception - - - array + + mixed - - \ArangoDBClient\Exception + + mixed - - \ArangoDBClient\ClientException + + mixed + + + mixed + + + + boolean + - $connection + $collection - \ArangoDBClient\Connection + mixed + + + $example + + mixed + + + $newValue + + mixed + + + $options + array() + mixed - - getInfo - \ArangoDBClient\Database::getInfo() - - Retrieves information about the current database - This will get information about the currently used database from the server - - \ArangoDBClient\Connection + + replaceByExample + \ArangoDBClient\CollectionHandler::replaceByExample() + + Replace document(s) matching a given example + This will replace the document(s) on the server + +This will throw if the document cannot be replaced + + \ArangoDBClient\Exception - - - array + + mixed - - \ArangoDBClient\Exception + + mixed - - \ArangoDBClient\ClientException + + mixed + + + mixed + + + + boolean + - $connection + $collection - \ArangoDBClient\Connection + mixed + + + $example + + mixed + + + $newValue + + mixed + + + $options + array() + mixed - - eJztmN1vGjkQwN/3r5iHSEC0gfbunvaatNvClVRtggLodGoi5PUOsFfvh2xvCDr1f+/Y+8FHyIWk6UPV7AusPR/2zM8zhlevs3nmOJ3DQwcOwZcsmaXdtzDoD4CLCBPtgYqSmUAImWYBU0hyRvRNxvgXNkOAWuudVbCTLNfzVNIc/EWTX+ATW6K0MzzNljKazTW8q7/99uLl7y5oGZG9RMH7OOi7NC3SWYIuvEcZs2RJ2h3HSViMilzjltc/V3ughTOlYEr+SY/NaPmrjXXLXahyG6N5pEqFTKbXUYikmSdcRymtRKeFCVzpgZ7LNJ/Na5MNVU+CPzh9FciTKkQioq3bZ651prxOJ0y5ajOrGQZtnsad/mg06FQGOlES4k17rmOxV5gpNRytg5ftP2yAiq1U9pz/HDNpI2Oew7V9WFflcMd+ctqyht7Z6OKfSdcf+W/9YW9y5n/qwTE0TOAbFOUte2OFcm9b42HvYmiM5UZrhzUukWlaG1ujzc5UAkW6aqkEF7VkEfgNaQqeZDGRlCRoMwoHfPX9iFKJsDZA2Q4QaG3hlgFFaBJE5jkwcShyWhqo/IPKkEfTiDNjzLX84Q2LMzo7jXhZBb6xvUYLyWP42DQjUecyASYlW8KBpENCGUDfvh5R3BCqsUKmXWsaoBcKLjf5uuzdcMzMVu4TLD62xQsMsjwQEacAUlB4fbDKDDZ3J8YtgtyyBgqAbeQzthQpC4mfz/WgeRSKqeftwhaOTwpb7v0KJZsnW8bNc3vEPBZieyqsm9X6j05mqM9tLNZ2WAwozzsfjE7Pzyb+eNS3TlvubvMZHeRF2AB4vPmBPxz+3W3dsn/l7H67Kk+kDXeNy/Gm9yxVujmWgnyNLz7WAXQ3pf5VaTLBhKchThaSZRnKZpXBVmvNT8lt7c5u7wNpN0nKCHx1bpWJLgq8v0wsIiEgtKLAEjqLkdLmGFc67edq8XNUiyKHD6wWuRRELnHaR0HweV6QRyKk953sfrZGrlr7HIByOcbD94L8kZCskVB3QiyM2Do95hbCdIE0GBZpjqrRtbljPSnTvzR3Juz1fekO/La5KzdYtJg6Xc11jZqGZxh+IhjCB4JwZ/mgqrCjBD20kuxix1xI7gToAqkt4bWlBQuI0ikw0yLXOCIAcikpNoUxTn2TcY7KsEe/6HJdmSva19I0OurC0XSKtZbtedTO7AUmleFT99lfGkOTOPOba9+69OiGaK+3jf06okH6KdrhitEooQtRbO9GwALiboPNe2995Or/TYilJWp1HZvKNH6unD8EWUrGKeVi37r5UE7LjP5YVAlW+8/KhImIqWaVIs+zoy40Lqt/r6qABZf1HZ6sfAOoGev2 - - - - ArangoDB PHP client: failover exception - - - - - - - \ArangoDBClient\Exception - FailoverException - \ArangoDBClient\FailoverException - - Failover-Exception - This exception type will be thrown internally when a failover happens - - - - - - $_leader - \ArangoDBClient\FailoverException::_leader - - - New leader endpoint - - - string + + removeByExample + \ArangoDBClient\CollectionHandler::removeByExample() + + Remove document(s) by specifying an example + This will throw on any error + + \ArangoDBClient\Exception - - - - $enableLogging - \ArangoDBClient\Exception::enableLogging - false - - - - - - - __toString - \ArangoDBClient\FailoverException::__toString() - - Return a string representation of the exception - - - string + + mixed - - - - setLeader - \ArangoDBClient\FailoverException::setLeader() - - Set the new leader endpoint - - - string + + mixed - - void + + array + + integer + + - $leader + $collection - + mixed + + + $document + + mixed + + + $options + array() + array - - getLeader - \ArangoDBClient\FailoverException::getLeader() - - Return the new leader endpoint - - - string + + removeByKeys + \ArangoDBClient\CollectionHandler::removeByKeys() + + Remove document(s) by specifying an array of keys + This will throw on any error + + \ArangoDBClient\Exception - - - - __construct - \ArangoDBClient\Exception::__construct() - - Exception constructor. - - - string + + mixed - - integer + + array - - \Exception + + array + + + array + - $message - '' - string + $collection + + mixed - $code - 0 - integer + $keys + + array - $previous - null - \Exception + $options + array() + array - \ArangoDBClient\Exception - - - enableLogging - \ArangoDBClient\Exception::enableLogging() - - Turn on exception logging - - - \ArangoDBClient\Exception - - - disableLogging - \ArangoDBClient\Exception::disableLogging() - - Turn off exception logging - - - \ArangoDBClient\Exception - - eJyVk99v2jAQx9/zV9wDEhRBWduXie5XR7dWVTVVyx6RoiMciTVztmwDRRX/ex0nDZCm05oXR7773n2+d/KnrzrXUTTq9yPow5VBztT1d3i4fYBUCmI3hgUKqdZkgB5T0k4o9qlF9jeN6V/MCKAWToImBHHlcmV8DO6QIXZES2QOoVTprRFZ7mBS/51/OPs42APcLGe3Ax+WKmMawA0Zr9569SiKGJdkfW9qtL2sffyskIc/Gsh/cmH3PsBtNcFGSAkzApcbtWEQ7MgwSrmFTU4MuB9AjloT26b9FvNWcFrM5eL0IjCnEq2tsWoqj+KI5xb2nE9RMbLgo/j68Is2IAnnxQJ4rpUoWoTQS4YHMbgE64zgrLochVMbsUZH0EnKCpfhttnhN7mVKYyWFcCQNmS9FQyMauFHQ4fbP+5uSnklHrZXOcZazaRIYbHiNHRIEqfioOqdhIRyCMVXFU+Syf1VHCcJnEJ3DF1/dJzf5fBLRu4+eOudlO52rR5jcsEFv2+a3s5/qirQtRLzf3q1NW+nrNh0XPmqNgafoXO4u130xvbeh1m7e1vSjn8w7vZNHeO/QHvs8AQSlAJt79VDGI9DeADdqSfzj4rttHpWs+mr7K5f9TMcvmlo - - - - ArangoDB PHP client: batch - - - - - - - - Batch - \ArangoDBClient\Batch - - Provides batching functionality - - - - - - $_batchResponse - \ArangoDBClient\Batch::_batchResponse - - - Batch Response Object - - - \ArangoDBClient\HttpResponse + + lookupByKeys + \ArangoDBClient\CollectionHandler::lookupByKeys() + + Bulk lookup documents by specifying an array of keys + This will throw on any error + + \ArangoDBClient\Exception - - - - $_processed - \ArangoDBClient\Batch::_processed - false - - Flag that signals if this batch was processed or not. Processed => true ,or not processed => false - - - boolean + + mixed - - - - $_batchParts - \ArangoDBClient\Batch::_batchParts - array() - - The array of BatchPart objects - - + + array + + array + + array + + - - - $_nextBatchPartId - \ArangoDBClient\Batch::_nextBatchPartId - - - The next batch part id - - - integer + + $collection + + mixed + + + $keys + + array + + + $options + array() + array + + + + range + \ArangoDBClient\CollectionHandler::range() + + Get document(s) by specifying range + This will throw if the list cannot be fetched from the server + + \ArangoDBClient\Exception + + + mixed + + string - - - - $_batchPartCursorOptions - \ArangoDBClient\Batch::_batchPartCursorOptions - array() - - An array of BatchPartCursor options - - + + mixed + + + mixed + + array + + + \ArangoDBClient\Cursor + - - - $_connection - \ArangoDBClient\Batch::_connection - - - The connection object - - - \ArangoDBClient\Connection + + $collection + + mixed + + + $attribute + + string + + + $left + + mixed + + + $right + + mixed + + + $options + array() + array + + + + near + \ArangoDBClient\CollectionHandler::near() + + Get document(s) by specifying near + This will throw if the list cannot be fetched from the server + + \ArangoDBClient\Exception - - - - $_sanitize - \ArangoDBClient\Batch::_sanitize - false - - The sanitize default value - - - boolean + + mixed - - - - $_nextId - \ArangoDBClient\Batch::_nextId - 0 - - The Batch NextId - - - integer - string + + double - - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - - - - string + + double - - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - - - - string + + array + + + + \ArangoDBClient\Cursor - - - __construct - \ArangoDBClient\Batch::__construct() - - Constructor for Batch instance. Batch instance by default starts capturing request after initiated. - To disable this, pass startCapture=>false inside the options array parameter - - \ArangoDBClient\Connection + + $collection + + mixed + + + $latitude + + double + + + $longitude + + double + + + $options + array() + array + + + + within + \ArangoDBClient\CollectionHandler::within() + + Get document(s) by specifying within + This will throw if the list cannot be fetched from the server + + \ArangoDBClient\Exception - + + mixed + + + double + + + double + + + integer + + array + + + \ArangoDBClient\Cursor + - $connection + $collection - \ArangoDBClient\Connection + mixed + + + $latitude + + double + + + $longitude + + double + + + $radius + + integer $options @@ -9413,946 +9442,1245 @@ specifying a different username or password. array - - setConnection - \ArangoDBClient\Batch::setConnection() - - Sets the connection for he current batch. (mostly internal function) + + lazyCreateCollection + \ArangoDBClient\CollectionHandler::lazyCreateCollection() + + - + + + + + $collection + + + + + $options + + + + + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler + + \ArangoDBClient\Connection - - \ArangoDBClient\Batch - $connection \ArangoDBClient\Connection + \ArangoDBClient\Handler - - startCapture - \ArangoDBClient\Batch::startCapture() - - Start capturing requests. To stop capturing, use stopCapture() - see ArangoDBClient\Batch::stopCapture() - - \ArangoDBClient\Batch + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object + + + \ArangoDBClient\Connection + \ArangoDBClient\Handler - - stopCapture - \ArangoDBClient\Batch::stopCapture() - - Stop capturing requests. If the batch has not been processed yet, more requests can be appended by calling startCapture() again. - see Batch::startCapture() - - \ArangoDBClient\ClientException + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() + + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection + + + + mixed - - \ArangoDBClient\Batch + + \ArangoDBClient\ClientException + + $optionName + + + + \ArangoDBClient\Handler - - isActive - \ArangoDBClient\Batch::isActive() - - Returns true, if this batch is active in its associated connection. - - - boolean - - - - - isCapturing - \ArangoDBClient\Batch::isCapturing() - - Returns true, if this batch is capturing requests. - - - boolean + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + + array + + + string + + + \ArangoDBClient\ClientException + + $body + + array + + \ArangoDBClient\Handler - - activate - \ArangoDBClient\Batch::activate() - - Activates the batch. This sets the batch active in its associated connection and also starts capturing. - - - \ArangoDBClient\Batch + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + + Helper function that runs through the options given and includes them into the parameters array given. + Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . + + array - - - - setActive - \ArangoDBClient\Batch::setActive() - - Sets the batch active in its associated connection. - - - \ArangoDBClient\Batch + + array - - - - setCapture - \ArangoDBClient\Batch::setCapture() - - Sets the batch's associated connection into capture mode. - - - boolean + + array - - \ArangoDBClient\Batch + + array - $state + $options - boolean + array - - - getActive - \ArangoDBClient\Batch::getActive() - - Gets active batch in given connection. - - - \ArangoDBClient\Connection - - - \ArangoDBClient\Batch - - - - $connection + $body - \ArangoDBClient\Connection + array + + + $includeArray + array() + array + \ArangoDBClient\Handler - - getConnectionCaptureMode - \ArangoDBClient\Batch::getConnectionCaptureMode() - - Returns true, if given connection is in batch-capture mode. + + makeCollection + \ArangoDBClient\Handler::makeCollection() + + Turn a value into a collection name - - \ArangoDBClient\Connection + + \ArangoDBClient\ClientException - - boolean + + mixed + + + string - $connection + $value - \ArangoDBClient\Connection + mixed + \ArangoDBClient\Handler - - setBatchRequest - \ArangoDBClient\Batch::setBatchRequest() - - Sets connection into Batch-Request mode. This is necessary to distinguish between normal and the batch request. + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation - - boolean + + array - - \ArangoDBClient\Batch + + mixed - + + $headers + + array + - $state + $collection - boolean + mixed + \ArangoDBClient\Handler - - nextBatchPartId - \ArangoDBClient\Batch::nextBatchPartId() - - Sets the id of the next batch-part. The id can later be used to retrieve the batch-part. + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use - - mixed + + string - - \ArangoDBClient\Batch + + \ArangoDBClient\DocumentClassable - $batchPartId + $class - mixed + string + \ArangoDBClient\DocumentClassable - - nextBatchPartCursorOptions - \ArangoDBClient\Batch::nextBatchPartCursorOptions() - - Set client side cursor options (for example: sanitize) for the next batch part. + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use - - mixed + + string - - \ArangoDBClient\Batch + + \ArangoDBClient\DocumentClassable - $batchPartCursorOptions + $class - mixed + string + \ArangoDBClient\DocumentClassable - - append - \ArangoDBClient\Batch::append() - - Append the request to the batch-part + + + Name of argument $collection does not match with the DocBlock's name $collectionId in importFromFile() + Parameter $collectionId could not be found in importFromFile() + No summary for method lazyCreateCollection() + + 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 + + + + ArangoDB PHP client: single database + + + + + + + + Database + \ArangoDBClient\Database + + A class for managing ArangoDB Databases + This class provides functions to manage Databases through ArangoDB's Database API<br> + + + + + + ENTRY_DATABASE_NAME + \ArangoDBClient\Database::ENTRY_DATABASE_NAME + 'name' + + Databases index - - mixed + + + + ENTRY_DATABASE_USERS + \ArangoDBClient\Database::ENTRY_DATABASE_USERS + 'users' + + Users index + + + + + create + \ArangoDBClient\Database::create() + + creates a database + This creates a new database<br> + + \ArangoDBClient\Connection - - mixed + + string - - \ArangoDBClient\HttpResponse + + + array - + + \ArangoDBClient\Exception + + \ArangoDBClient\ClientException - $method + $connection - mixed + \ArangoDBClient\Connection - $request + $name - mixed + string - - splitWithContentIdKey - \ArangoDBClient\Batch::splitWithContentIdKey() - - Split batch request and use ContentId as array key - - - mixed + + delete + \ArangoDBClient\Database::delete() + + Deletes a database + This will delete an existing database. + + \ArangoDBClient\Connection - - mixed + + string - + + array - + + \ArangoDBClient\Exception + + \ArangoDBClient\ClientException - $pattern + $connection - mixed + \ArangoDBClient\Connection - $string + $name - mixed + string - - process - \ArangoDBClient\Batch::process() - - Processes this batch. This sends the captured requests to the server as one batch. - - - \ArangoDBClient\HttpResponse - \ArangoDBClient\Batch + + listDatabases + \ArangoDBClient\Database::listDatabases() + + List databases + This will list the databases that exist on the server + + \ArangoDBClient\Connection - - \ArangoDBClient\ClientException + + + array - + \ArangoDBClient\Exception - - - - countParts - \ArangoDBClient\Batch::countParts() - - Get the total count of the batch parts - - - integer + + \ArangoDBClient\ClientException + + $connection + + \ArangoDBClient\Connection + - - getPart - \ArangoDBClient\Batch::getPart() - - Get the batch part identified by the array key (0. - ..n) or its id (if it was set with nextBatchPartId($id) ) - - mixed + + databases + \ArangoDBClient\Database::databases() + + List databases + This will list the databases that exist on the server + + \ArangoDBClient\Connection - - mixed + + + array - + + \ArangoDBClient\Exception + + \ArangoDBClient\ClientException - $partId + $connection - mixed + \ArangoDBClient\Connection - - getPartResponse - \ArangoDBClient\Batch::getPartResponse() - - Get the batch part identified by the array key (0. - ..n) or its id (if it was set with nextBatchPartId($id) ) - - mixed + + listUserDatabases + \ArangoDBClient\Database::listUserDatabases() + + List user databases + Retrieves the list of all databases the current user can access without +specifying a different username or password. + + \ArangoDBClient\Connection - - mixed + + + array - + + \ArangoDBClient\Exception + + \ArangoDBClient\ClientException - $partId + $connection - mixed + \ArangoDBClient\Connection - - getProcessedPartResponse - \ArangoDBClient\Batch::getProcessedPartResponse() - - Get the batch part identified by the array key (0. - ..n) or its id (if it was set with nextBatchPartId($id) ) - - mixed + + getInfo + \ArangoDBClient\Database::getInfo() + + Retrieves information about the current database + This will get information about the currently used database from the server + + \ArangoDBClient\Connection - - mixed + + + array - + + \ArangoDBClient\Exception + + \ArangoDBClient\ClientException - $partId + $connection - mixed + \ArangoDBClient\Connection - - getBatchParts - \ArangoDBClient\Batch::getBatchParts() - - Returns the array of batch-parts + + eJztmN1vGjkQwN/3r5iHSEC0gfbunvaatNvClVRtggLodGoi5PUOsFfvh2xvCDr1f+/Y+8FHyIWk6UPV7AusPR/2zM8zhlevs3nmOJ3DQwcOwZcsmaXdtzDoD4CLCBPtgYqSmUAImWYBU0hyRvRNxvgXNkOAWuudVbCTLNfzVNIc/EWTX+ATW6K0MzzNljKazTW8q7/99uLl7y5oGZG9RMH7OOi7NC3SWYIuvEcZs2RJ2h3HSViMilzjltc/V3ughTOlYEr+SY/NaPmrjXXLXahyG6N5pEqFTKbXUYikmSdcRymtRKeFCVzpgZ7LNJ/Na5MNVU+CPzh9FciTKkQioq3bZ651prxOJ0y5ajOrGQZtnsad/mg06FQGOlES4k17rmOxV5gpNRytg5ftP2yAiq1U9pz/HDNpI2Oew7V9WFflcMd+ctqyht7Z6OKfSdcf+W/9YW9y5n/qwTE0TOAbFOUte2OFcm9b42HvYmiM5UZrhzUukWlaG1ujzc5UAkW6aqkEF7VkEfgNaQqeZDGRlCRoMwoHfPX9iFKJsDZA2Q4QaG3hlgFFaBJE5jkwcShyWhqo/IPKkEfTiDNjzLX84Q2LMzo7jXhZBb6xvUYLyWP42DQjUecyASYlW8KBpENCGUDfvh5R3BCqsUKmXWsaoBcKLjf5uuzdcMzMVu4TLD62xQsMsjwQEacAUlB4fbDKDDZ3J8YtgtyyBgqAbeQzthQpC4mfz/WgeRSKqeftwhaOTwpb7v0KJZsnW8bNc3vEPBZieyqsm9X6j05mqM9tLNZ2WAwozzsfjE7Pzyb+eNS3TlvubvMZHeRF2AB4vPmBPxz+3W3dsn/l7H67Kk+kDXeNy/Gm9yxVujmWgnyNLz7WAXQ3pf5VaTLBhKchThaSZRnKZpXBVmvNT8lt7c5u7wNpN0nKCHx1bpWJLgq8v0wsIiEgtKLAEjqLkdLmGFc67edq8XNUiyKHD6wWuRRELnHaR0HweV6QRyKk953sfrZGrlr7HIByOcbD94L8kZCskVB3QiyM2Do95hbCdIE0GBZpjqrRtbljPSnTvzR3Juz1fekO/La5KzdYtJg6Xc11jZqGZxh+IhjCB4JwZ/mgqrCjBD20kuxix1xI7gToAqkt4bWlBQuI0ikw0yLXOCIAcikpNoUxTn2TcY7KsEe/6HJdmSva19I0OurC0XSKtZbtedTO7AUmleFT99lfGkOTOPOba9+69OiGaK+3jf06okH6KdrhitEooQtRbO9GwALiboPNe2995Or/TYilJWp1HZvKNH6unD8EWUrGKeVi37r5UE7LjP5YVAlW+8/KhImIqWaVIs+zoy40Lqt/r6qABZf1HZ6sfAOoGev2 + + + + ArangoDB PHP client: streaming transaction handler + + + + + + + \ArangoDBClient\Handler + StreamingTransactionHandler + \ArangoDBClient\StreamingTransactionHandler + + Provides management of streaming transactions + + + + + + + $_pendingTransactions + \ArangoDBClient\StreamingTransactionHandler::_pendingTransactions + array() + + - - array - - - - getCursorOptions - \ArangoDBClient\Batch::getCursorOptions() - - Return an array of cursor options + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object - - array + + \ArangoDBClient\Connection - - - getConnection - \ArangoDBClient\Batch::getConnection() - - Return this batch's connection + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + - - \ArangoDBClient\Connection + + string - - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + - + string - - \ArangoDBClient\DocumentClassable + + + + __construct + \ArangoDBClient\StreamingTransactionHandler::__construct() + + Construct a new streaming transaction handler + + + \ArangoDBClient\Connection + - $class + $connection - string + \ArangoDBClient\Connection - \ArangoDBClient\DocumentClassable - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use + + create + \ArangoDBClient\StreamingTransactionHandler::create() + + Creates a streaming transaction from scratch (no collections) or from an +existing transaction object (necessary when collections need to be passed +into the transaction or when an existing transaction is resumed) - - string + + \ArangoDBClient\ServerException - - \ArangoDBClient\DocumentClassable + + \ArangoDBClient\StreamingTransaction - $class + $trx + null + \ArangoDBClient\StreamingTransaction + + + + closePendingTransactions + \ArangoDBClient\StreamingTransactionHandler::closePendingTransactions() + + Closes all pending transactions created by the handler + + + + + stealTransaction + \ArangoDBClient\StreamingTransactionHandler::stealTransaction() + + Steal the transaction from the handler, so that it is not responsible anymore +for auto-aborting it on shutdown + + + string + + + + $id string - \ArangoDBClient\DocumentClassable - - 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 - - - - ArangoDB PHP client: connection - - - - - - - - - TraceRequest - \ArangoDBClient\TraceRequest - - Class TraceRequest - - - - - - - $_headers - \ArangoDBClient\TraceRequest::_headers - array() - - Stores each header as an array (key => value) element + + getStatus + \ArangoDBClient\StreamingTransactionHandler::getStatus() + + Retrieves the status of a transaction - + + \ArangoDBClient\ServerException + + + mixed + + array - - - $_method - \ArangoDBClient\TraceRequest::_method - - - Stores the http method + + $trx + + mixed + + + + commit + \ArangoDBClient\StreamingTransactionHandler::commit() + + Commits a transaction - - string + + \ArangoDBClient\ServerException + + + mixed + + + boolean - - - $_requestUrl - \ArangoDBClient\TraceRequest::_requestUrl - - - Stores the request url + + $trx + + mixed + + + + abort + \ArangoDBClient\StreamingTransactionHandler::abort() + + Aborts a transaction - - string + + \ArangoDBClient\ServerException + + + mixed + + + boolean - - - $_body - \ArangoDBClient\TraceRequest::_body - - - Store the string of the body + + $trx + + mixed + + + + getRunning + \ArangoDBClient\StreamingTransactionHandler::getRunning() + + Return all currently running transactions - - string + + \ArangoDBClient\ServerException + + + array - - - $_type - \ArangoDBClient\TraceRequest::_type - 'request' - - The http message type + + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler - - string + + \ArangoDBClient\Connection - - - __construct - \ArangoDBClient\TraceRequest::__construct() + + $connection + + \ArangoDBClient\Connection + + \ArangoDBClient\Handler + + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object + + + \ArangoDBClient\Connection + + + \ArangoDBClient\Handler + + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() - Set up the request trace + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection - - array + + + mixed - - string + + \ArangoDBClient\ClientException - - string + + + $optionName + + + + \ArangoDBClient\Handler + + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + + array - + string + + \ArangoDBClient\ClientException + - $headers + $body array + \ArangoDBClient\Handler + + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + + Helper function that runs through the options given and includes them into the parameters array given. + Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . + + array + + + array + + + array + + + array + + - $method + $options - string + array - $requestUrl + $body - string + array - $body - - string + $includeArray + array() + array + \ArangoDBClient\Handler - - getHeaders - \ArangoDBClient\TraceRequest::getHeaders() - - Get an array of the request headers + + makeCollection + \ArangoDBClient\Handler::makeCollection() + + Turn a value into a collection name - - array + + \ArangoDBClient\ClientException - - - - getMethod - \ArangoDBClient\TraceRequest::getMethod() - - Get the request method - - + + mixed + + string + + $value + + mixed + + \ArangoDBClient\Handler - - getRequestUrl - \ArangoDBClient\TraceRequest::getRequestUrl() - - Get the request url + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation - - string + + array + + + mixed + + $headers + + array + + + $collection + + mixed + + \ArangoDBClient\Handler - - getBody - \ArangoDBClient\TraceRequest::getBody() - - Get the body of the request + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use - + string + + \ArangoDBClient\DocumentClassable + + + $class + + string + + \ArangoDBClient\DocumentClassable - - getType - \ArangoDBClient\TraceRequest::getType() - - Get the http message type + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use - + string + + \ArangoDBClient\DocumentClassable + + + $class + + string + + \ArangoDBClient\DocumentClassable - eJylVk1vm0AQvfMr5mDJHyJ1k97skqZxVVuVKkWpe6ora40nBgUWurtYsqr+987uAsaATa1y8cfMm/fmzbDw/kMapM54NHJgBB8F47vk0yM8LZ7Aj0LkagJ+wjn6Kkw4peish5T5r2yHACVgZnJNkGUqSATF4Avj8E0hxozzWugz4fxQwizIqIAJ+kl6EOEuUDArv929vb1zQYmQ2LiEebxZuBSOkh1HF+YoqPSB0GPH4SxGScKwpmnqFM3NIiYlLAXlPOOvDKUq+rmo62KzMuS+DgHcvnlnhPhNlt+OTjAq9DUiUxKBEpD5AQTItiiASSC3mBDsAINXPIB3D3sWZTgEjDA2fAZc1HjYM2Hz83/G5jMV4Z4phN7aFpbgwY+fZEK7BBUgBEqlECNZsG3jkGS/tqKVxMIulhfWBchEdHX5HPtdRGcoDIMtAcmL+bVJtoeriTSoSbE8uiOl3gF1SPHq2hpEU+jnzfRbWkGyJz1xS+kFqlOlTLA4XxLoFQOm68ZgbYBsMJrzcA2ce9Wzg4MjuCA+WYQ66jiPGuo43DpEOwtQITpOy8isjCs3LttEoQ8vGTdnDqzXdAARKPPVoOjZLRpwq5pcyzY0ZexNp6+eCkJ5c7+u+OWV7k0baRVnvIKmmVVxwqtqaGZWDPCsQJvzp7EGc1qD8hDIt7kw+HSapdcCVSZ42zlQc3GHamFLDOr+5DVqNl0SeXZf6rra7oumsK+mRJeu6iS6ZbWcNldpei4n2qWrPvvz2swmnM71vzQ+Ur0udV37pv7liLtK1ZIKdKnSJIUq0mWemWsWhUwOqk/OycREXOivineAVf4Q3qyqif3h1PkLRzV67g== + + No summary for property $_pendingTransactions + + eJzlWEtv4zYQvvtXzMGA5MBe94Ee6m3Spmmx2UWxDZLsKQkMSppY3EikQFKxjW7+e4fUw3rZTdO9BM3BkUTOcObjN99Q+unnLM5Go/nR0QiO4FQxsZK//QoX5xcQJhyFWYA2ClnKxQoMDWsWGi4FxExECSqysoa/ZCx8YCsEqH2cOXM3yHITS0Vj8IEJuDKIKRPCDYUy2yq+ig2c1VffffPtj9NdLO/S4HxKw4lcCZzCO1RkvSXr+WgkWIqa1sbOsm/rlC6UfOQRaiAjCjClQZD3w0npZ2WjuQjtEMD3b35wYYQJ05ryKl1e7zyeFygBbgyKSEN5P/prZO0zxR+ZQRgvMxptW2o4hps7ysNOdLnYvyPCQVDseWiAgcD1P+2OM6psKS/FUutCYDFvHO6uZ9C4MRIChFxj1PYxLwLPg4SHcJ+LYvZyGVZh+cPeJ86uSNt5YMqSa9G0bE5/W89UuOLaoFrqODeRXItltazPlGJbf2xirqfghYnUeNEH0puU3p76YBJ2hrjB9sB4r2QKOlTMhDH4QhJCSVJEqCdAlHYTiNOVQ9xQrF0vMvhMNmSPIWrN1BbWMYqmL9pJjErMM+JSjTpwQU9NjG2HqvBACw8uyDWhpvMUo0mXASZWck1cRfWI6vdNiJm1GObJEKFhbNSGqDK07kGKhA5qf7/PYxB5kkygQxR+D34xflzN2A3av8qYamHIeUGP2ckKzY6Z/qRBsKf6qr4YE3wZ7QuS42H72UkmtfFbkXxSiV4sPl3+sby+PP14dXp2/f7Pj/AGvHlAHBbetBP3sN/PWoolilBGuFwrlmWoHACzE2aM4kFOhJ3Unhp57KK3Li4bGVTZuNU+aLvOzmzMo0ZUx23rG88SKTHe3Y3HI++uYeZC0mjeRz65mJRK1chsSNRuaOodLUIFj80SN7kqaLC3Um1xU6EmCZRuW8Jd0iuCYOuqpa1/exi5Ry/8rlbN50AdTKbM8JAC2AILpDIullxQgZKQkZ0beaB6mkmKsBXdFLSENUIkhWeabhNkD6BdLdqKlbkihbA5CGlcfL08a+t7SRlbVTqANjDttvf4BMa0NnZLx5AUtZ80ts8lWW5tc/gJwkIOb2v5gHHPdZkgXwmK00GFSkmlIUaFbX8DhXgop6Itlizp0oTOFizp6aVT6QYt3H6YmBngxoqlRbusER4kFK7YprIK88hC7Qgwc5DYLSEzcls1pGH1pI5ip1r8Z211jg7SUtsUWgLGoy4jcypNc2jnXZ1N9sJ0iRQcPhLXLCraMJNreypiA3L+otaR8g0VY9krhntr2RUJ2zY4lrQFdl3XpUy4rk9ui1ttu2DxaM1NDDuRBKtYNBqBV2ToHcSdpPHKTXNqu78PcTquMDoBElxD/abXnmz9lWq5cmrZbD2ACUn0kIVfYDBpqGK5mfW8ZzQpeuBTWzrHhNrIYhHkPIno3h9sVVMoaNNsDs9qJbvpJZUOdJFyKxqdxCFbGVKT91yZIe3dly/QGghlmnJjh/qHAJf/YO0Mgle1nOEwq8Kxv/0DuA1Cv45aCaRMnPzkaHEuAASdhyEdOKkvlXG6g2Ql5pI0Qa25xoPlUrh6NbXyLH7sPerlL6gieiPxmrVR7sju5NM/5Jxa4r9OZhVHoq9BrPLc8X/gVYQJ0jvRSwT6EK3s70DHd72TDmJhruy7N51WVS5E/xPIS/jWac3Ff9qdw2tNwR1hO6+uX6+fXxZr+j0i/YvW2d+F//7KNdx8msh0WhAxzn1jWrKEM+2f1V8Oyu9Ji4UbJsm5JbTYCoW+Lb9cBbcHvktZgfobsOoKXQ== - + - ArangoDB PHP client: connect exception + ArangoDB PHP client: batchpart - - + + - - \ArangoDBClient\Exception - ConnectException - \ArangoDBClient\ConnectException - - Connect-Exception - This exception type will be thrown by the client when there is an error -during connecting to the server.<br> -<br> - - - + + + BatchPart + \ArangoDBClient\BatchPart + + Provides batch part functionality + + + - - $enableLogging - \ArangoDBClient\Exception::enableLogging - false + + $_cursorOptions + \ArangoDBClient\BatchPart::_cursorOptions + array() + + An array of BatchPartCursor options + + + array + + + + + $_id + \ArangoDBClient\BatchPart::_id + + + An array of BatchPartCursor options + + + array + + + + + $_type + \ArangoDBClient\BatchPart::_type + + + An array of BatchPartCursor options + + + array + + + + + $_request + \ArangoDBClient\BatchPart::_request + array() + An array of BatchPartCursor options + + + array + + + + + $_response + \ArangoDBClient\BatchPart::_response + array() + + An array of BatchPartCursor options + + + \ArangoDBClient\HttpResponse + + + + + $_batch + \ArangoDBClient\BatchPart::_batch + + + The batch that this instance is part of + + + \ArangoDBClient\Batch + + + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + string + - - __toString - \ArangoDBClient\ConnectException::__toString() - - Return a string representation of the exception + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + - + string - - + + __construct - \ArangoDBClient\Exception::__construct() - - Exception constructor. + \ArangoDBClient\BatchPart::__construct() + + Constructor - - string + + \ArangoDBClient\Batch - - integer + + mixed - - \Exception + + mixed + + + mixed + + + mixed + + + mixed - $message - '' - string + $batch + + \ArangoDBClient\Batch - $code - 0 - integer + $id + + mixed - $previous - null - \Exception + $type + + mixed + + + $request + + mixed + + + $response + + mixed + + + $options + + mixed - \ArangoDBClient\Exception - - enableLogging - \ArangoDBClient\Exception::enableLogging() - - Turn on exception logging + + setBatch + \ArangoDBClient\BatchPart::setBatch() + + Sets the id for the current batch part. + + \ArangoDBClient\Batch + + + \ArangoDBClient\BatchPart + - \ArangoDBClient\Exception + + $batch + + \ArangoDBClient\Batch + - - disableLogging - \ArangoDBClient\Exception::disableLogging() - - Turn off exception logging + + setId + \ArangoDBClient\BatchPart::setId() + + Sets the id for the current batch part. + + mixed + + + \ArangoDBClient\BatchPart + - \ArangoDBClient\Exception + + $id + + mixed + - - eJyFkk1rAjEQhu/7K+ZQ8AO/6lHFam1RSgul9igs2Tjuhq6TZZKtleJ/bxJXLVJoLpNl5nln3smO7oqsiKJusxlBE6YsKNUP9/C6eAWZKyQ7AKmJUFrAL4mFVZpcpS+eFEJ+iBQBztwsICEpSptpdjl4EgRLi7gVRCEldbFnlWYWZudbv3fbb4Fl5QTJwHybLFouneuUsAVzZEfvHd2NIhJbNK43XrUdnm3MjhO3H68mfs+UudgAuy8QdirPIUGwGesdQbJ3N6y8wy5D8t+M4EjnA5k1e6l1yYrS02781epAGuRP5M4o4bGvq+L/+zKKpE8B9Dr9YFTmwpiTl7MVN79FWhu4mPuOPBa8+9OEN7QlEwgwNkzJWDAa10kEBb0Jk/56z4Cd6Akf8Qpu/61SVXdDLMokVxI2JcnQIY6tXgaq3ggFxxH9qcTjePY8XS7jGDpQG0DNhRvrnqc9TtG+oDFuUfXGMGCH6BAdtxGLXAlTv97JYBCyLaitTn/QqlpxsrourjnVH36V7/s= - - - - ArangoDB PHP client: value validator - - - - - - - - ValueValidator - \ArangoDBClient\ValueValidator - - A simple validator for values to be stored in the database - - - - - - validate - \ArangoDBClient\ValueValidator::validate() - - Validate the value of a variable - Allowed value types are string, integer, double and boolean. Arrays are also allowed if they contain only one of the former types. - - \ArangoDBClient\ClientException + + getId + \ArangoDBClient\BatchPart::getId() + + Gets the id for the current batch part. + + + mixed - + + + + setType + \ArangoDBClient\BatchPart::setType() + + Sets the type for the current batch part. + + mixed - - void + + \ArangoDBClient\BatchPart - $value + $type mixed - - eJyFVE1v2zAMvftX8FAgWeAlXY/JgqXrhnY7FRiQU4CAtmlbqCwZktw0WPvfR8kfSYwAExDbEJ/4Hh+pfP1Wl3UULWazCGZwb1AV+sd3eH56hlQKUm4Jrygb8k+RodOGcR66qTF9wYIAhlMP4UAIYuNKbTgGv1HBH0dUoVIhlOr6aERROngYvu5uv9zF4IzghMrCY5U8xRyWulAUwyMZPn3k04soUliRZW4a0a5ORYAVVS3PJEPOv1CGBachIbC8SxkIBa4kYBAmaGlc2pXCrFCpr/l2fhf0pBKtha3PvR0c+hv5yoMcv2bQhSiwtX7qHJA/ueREUofr4fdS6gPLa5HuWLNuNF61EaqIWbajgkwMmW74NKDKINFaEqo5izZ4bPEoreZHm0zknv0IqVYOuXCt5JEfQYmXxR5VZFq2+UjQxpVGHyy0Rvx8S6l2QqsxqkaDFVTijeluWvGf+yJ0345xsRtDrjEKXrXIGH4QUkKg84p5eIQKB8/MAGGhZtsp63IswrtmL0TKJqHjV96o1GscaKetok8B23bILyaZCrtvre0x8P7OJHv2ebSTS43jPe/8+ZZquIL1eg393oksjMViKKJrzUW4dWM17H1EY6noG9wTXsleNdZBWlL64gmAJFXcNNs3fsTHbSdMS+gSAlq4sU2yvSbdL0syXy5Ppg7Y1QX0TPZ/qjrzo2v1EGrHQNFhPHjTya9uKhLBsx/mjhx1l3zSafmImCZc0D1j0U4vr+lyGWIxTHb9P8+uu/HJ7hLqM/4Dz/eQjg== - - - - ArangoDB PHP client: autoloader - - - - - - - - Autoloader - \ArangoDBClient\Autoloader - - Handles automatic loading of missing class files. - The autoloader can be nested with other autoloaders. It will only -process classes from its own namespace and ignore all others.<br> -<br> - - - - - EXTENSION - \ArangoDBClient\Autoloader::EXTENSION - '.php' - - Class file extension + + getType + \ArangoDBClient\BatchPart::getType() + + Gets the type for the current batch part. + + mixed + - - - $libDir - \ArangoDBClient\Autoloader::libDir - - - Directory with library files + + + setRequest + \ArangoDBClient\BatchPart::setRequest() + + Sets the request for the current batch part. - - string + + mixed + + + \ArangoDBClient\BatchPart - - - init - \ArangoDBClient\Autoloader::init() - - Initialise the autoloader + + $request + + mixed + + + + getRequest + \ArangoDBClient\BatchPart::getRequest() + + Gets the request for the current batch part. - - \ArangoDBClient\Exception - - - void + + array - - load - \ArangoDBClient\Autoloader::load() - - Handle loading of an unknown class - This will only handle class from its own namespace and ignore all others. - -This allows multiple autoloaders to be used in a nested fashion. - - string + + setResponse + \ArangoDBClient\BatchPart::setResponse() + + Sets the response for the current batch part. + + + mixed - - void + + \ArangoDBClient\BatchPart - $className + $response - string + mixed - - checkEnvironment - \ArangoDBClient\Autoloader::checkEnvironment() - - Check the runtime environment - This will check whether the runtime environment is compatible with the -Arango PHP client. - + + getResponse + \ArangoDBClient\BatchPart::getResponse() + + Gets the response for the current batch part. + + + \ArangoDBClient\HttpResponse + + + + + getHttpCode + \ArangoDBClient\BatchPart::getHttpCode() + + Gets the HttpCode for the current batch part. + + + integer + + + + + getProcessedResponse + \ArangoDBClient\BatchPart::getProcessedResponse() + + Get the batch part identified by the array key (0. + ..n) or its id (if it was set with nextBatchPartId($id) ) + \ArangoDBClient\ClientException - - void + + mixed - - eJyVVttu2zgQffdXTIGglgOvnAZIH9x4N15HaFygaZAERRcIIFAyLXFDkVqSshO0/fcOKcmi5QaL6MGiNbczM2dGOv+rzMvBYHJ8PIBjmCsiMnn5N9xc3UDKGRVmCqQykkuyogpVrNZFSdJHklGAncHC6TohqudSoQw+EQF3htKCCOFEqSyfFctyA4vd6fTk3ekYjGLoUGj4WCRXYxRzmQk6ho9UofUzWk8GA0EKqjE27YX9sMN/RcSKU+0gF8SwFCxwJjKQayiY1vaYcqI1rBkqhk1G9zn10oQUgScUBNWGrmDLTA7S5CjodHQIS4MizkEKbgFCqWRK0bPzjyDWShbAjAa5FdBhR4jAMiEVHq21dazD80T9aZ009/8vM6aSWhHASXjq6lPnNe+69X1gxa409jqGS6ZoaqR6rnPiLFEE/7hSNDqt6sWGKNDYFpE1jybuXiq2IYaiyJX3CH2gV+xAL9RiV2SgTwY7y6TYc5RKoQ1E3+6j67vll2uYwTBEKg4PXS0FM4xwpimYvT71IZtcya2G6CmlpeniwYWiplICNpKt9pOpEo5JNLmsK5FaM2AYMBg5jbqE9tKUr6fTNKfpYyQ2TElRYCuCUYO3U2lKggnF8eXyNo4hBLxHi/svt//Ed9HN/HaOR9+u5HGbVaxoxpB2Kojj6/nn6O5mvoicj+FD19rp1N6HGNza/zwoWT0HPvmR0ZV4FJaKjie92t3nTHdshry2byblNTz+nV8U274UFTes5H4HNRhpJ63SOGdMAGlnbk10jq3ou8ORUKRoeAlHDt81IoI/HDCbaI25duuCrPo+XskG6yToQvV5cdRVxHa837OH4YdOlVOR4dzhNbM54N+gM/eZNJm0J7aGQFcJansYxnAybr2N4M1s5qEYedis8YmTo30p9Z4Lz8S3sVddoQ74zz1k9XhgO3F+c7KhWGmKrMIuY+MSukZG7NTtJlQm2J8MC0hUnPsZK/pfhdupN0Mh/Cb3XeJho71bIi+Nw8JOrVseqhKGIVFoN8IvToKbddjm1K3+F6wBtVNZlMiZBKnt9iqqtt7qxe29Tg8Y3SyterO/YnXt7+EdWw8XVI+vuEdNcFSQf6XCUhYMB3iEdKRPJZcrGgzD4djCjb9Gt7akfo8snQImzAhqeziHM/jxo/dwht09g7dvoX1qQ6Dq+wOaudRx4rf97IPhUnhFtdXzSh7ihi/xPWZXgBWdhe8BI+T4OUFVuxNrItS/SAhHnxhfIkQH/hp1z8c4p+0HyEPzqk28bWt9/gJGybR/ - - - - ArangoDB PHP client: client exception - - - - - - - \ArangoDBClient\Exception - ClientException - \ArangoDBClient\ClientException - - Client-Exception - This exception type will be thrown by the client when there is an error -on the client side, i.e. something the server is not involved in.<br> -<br> - - - - - - $enableLogging - \ArangoDBClient\Exception::enableLogging - false - - - - - - - __toString - \ArangoDBClient\ClientException::__toString() - - Return a string representation of the exception + + getCursorOptions + \ArangoDBClient\BatchPart::getCursorOptions() + + Return an array of cursor options - - - string + + array - - __construct - \ArangoDBClient\Exception::__construct() - - Exception constructor. + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use - + string - - integer - - - \Exception + + \ArangoDBClient\DocumentClassable - $message - '' + $class + string - - $code - 0 - integer - - - $previous - null - \Exception - - \ArangoDBClient\Exception - - - enableLogging - \ArangoDBClient\Exception::enableLogging() - - Turn on exception logging - - - \ArangoDBClient\Exception + \ArangoDBClient\DocumentClassable - - disableLogging - \ArangoDBClient\Exception::disableLogging() - - Turn off exception logging + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use + + string + + + \ArangoDBClient\DocumentClassable + - \ArangoDBClient\Exception + + $class + + string + + \ArangoDBClient\DocumentClassable - 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 @@ -10553,23 +10881,23 @@ This is a convenience function that calls json_encode_wrapper on the connection< \ArangoDBClient\Handler - + includeOptionsInBody \ArangoDBClient\Handler::includeOptionsInBody() - + Helper function that runs through the options given and includes them into the parameters array given. Only options that are set in $includeArray will be included. This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - + array - + array - + array - + array @@ -10590,19 +10918,19 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\Handler - + makeCollection \ArangoDBClient\Handler::makeCollection() - + Turn a value into a collection name - + \ArangoDBClient\ClientException - + mixed - + string @@ -10613,6 +10941,31 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\Handler + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + + array + + + mixed + + + + $headers + + array + + + $collection + + mixed + + \ArangoDBClient\Handler + setDocumentClass \ArangoDBClient\DocumentClassable::setDocumentClass() @@ -10656,2888 +11009,2978 @@ This is only for options that are to be sent to the ArangoDB server in a json bo eJzlVlFP20gQfs+vmFapbCMnob3qHgLh4KCUnqCNoNFVByja2OtkW2d3tbsuoVX++82sjUkMSDnUt9uXON6Zb775dma8u3/omW61eltbLdiCA8PkVB39CcOTISS54NL1IVOLBRQ6VyxFGzLb1yz5xqYcoPY49MZ+kxVupgzuwWc1h3M+ldzALr6bM9s1/u9+NukYbjkzyayb8j3vlyh9a8R05uCwfnqz/fr3GJwRGE1aeD+fnMS4nStEieE9N3Mmb9G712pJNucWifEGp5377DAlZi0mZKp8hJzCMaXHtM5FwpxQEn4IbcEpYJAyxybM8o3StkImtAXwW/e1p1RGI/wTJtMcVeALx2Vqofrf+tkie0+P1haMPC3AbRDSOpbnSCOrGHYrqzvjfTcz6sZCSeLdIuGaEmhaaWbYHCyKiNm2c5Ww/B+hca8DbsZBMzejdOnZb/p4HYxHSnToiMR3ThalZr2K2BP4c1VIN1RCugrfv+ho/4aUp3cIHsO8sA4mfCok3AjkwCDoBQ1UZgy7BWgrn5kFz5pQssIVhkNh8TyaCRuOe7LyLUlYbr6j/lhzGmEeeFwUWuOe/ZsZiVnYEOv/7Kg7koXl6bHCKsuHxIc7bqLKq+d/dTHBwkE6MvHFU4lDh44ih7Xc8aoyccWtTmsAl9clblkRtEQG4YtM5HzMF8I6e48VRStmtHwdgOQ3zVIIXxKRDh33z9p9CaniFqRy4JEhJD0xEAgLhTScpWyS86j7Mtqpwyxb9aMzt434ba0QhtbAA42n3I0TJbHY13jvrHvdnQZ6td1M2M4e+h0qKbnXMow6ewQcjkxu+/3R+el4NDz9dHAUlwERbg2PBKsxPdaJc/pQpTyMYBfebm83dduYRbFK4vjTly/jDx8vPh+cnsbw1So55jKhMJcBFvYHmakABnuwzuUvS1iXAelDoyq4jiHwJVEa31fHddQQ6vnJ0aq64TE2D8MsWw9ePV1cQV1cd7MqY5hdGjSAG6CbAJaj5hG8JeCUTmYQXviOrn2hzTfvinYpwhl2PI6PMFqr8xXGK4P5nM8VTkFWD8dfMoz/58PSeFHp0A80zsr/OCAfmUPP6+XRxye6ebP2fF5rbtyWG3eP1VhULiu7CAf5elNCSIz68CqNghie4hs9r9W8BI2mgsFgAAH5CrwX0dcmQw2xmR8RY4OkzugAoOyMV+XXi6oQjbvB2se1eTzLXzcU8Cj8nW7McsFsuHKz6/f9Bo70q7vL6lV1R5xcrdjRKPsXC/JtTg== - + - ArangoDB PHP client: single user document + ArangoDB PHP client: connection - - + + - - \ArangoDBClient\Document - User - \ArangoDBClient\User - - Value object representing a single User document - <br> - - - + + + Connection + \ArangoDBClient\Connection + + Provides access to the ArangoDB server + As all access is done using HTTP, we do not need to establish a +persistent connection and keep its state.<br> +Instead, connections are established on the fly for each request +and are destroyed afterwards.<br> + + - - ENTRY_ID - \ArangoDBClient\Document::ENTRY_ID - '_id' - - Document id index - - - - - ENTRY_KEY - \ArangoDBClient\Document::ENTRY_KEY - '_key' - - Document key index + + $_options + \ArangoDBClient\Connection::_options + + + Connection options + + array + - - - ENTRY_REV - \ArangoDBClient\Document::ENTRY_REV - '_rev' - - Revision id index + + + $_httpHeader + \ArangoDBClient\Connection::_httpHeader + '' + + Pre-assembled HTTP headers string for connection +This is pre-calculated when connection options are set/changed, to avoid +calculation of the same HTTP header values in each request done via the +connection + + string + - - - ENTRY_ISNEW - \ArangoDBClient\Document::ENTRY_ISNEW - '_isNew' - - isNew id index + + + $_baseUrl + \ArangoDBClient\Connection::_baseUrl + '' + + Pre-assembled base URL for the current database +This is pre-calculated when connection options are set/changed, to avoid +calculation of the same base URL in each request done via the +connection + + string + - - - ENTRY_HIDDENATTRIBUTES - \ArangoDBClient\Document::ENTRY_HIDDENATTRIBUTES - '_hiddenAttributes' - - hidden attribute index + + + $_handle + \ArangoDBClient\Connection::_handle + + + Connection handle, used in case of keep-alive + + resource + - - - ENTRY_IGNOREHIDDENATTRIBUTES - \ArangoDBClient\Document::ENTRY_IGNOREHIDDENATTRIBUTES - '_ignoreHiddenAttributes' - - hidden attribute index + + + $_useKeepAlive + \ArangoDBClient\Connection::_useKeepAlive + + + Flag if keep-alive connections are used - - - - OPTION_WAIT_FOR_SYNC - \ArangoDBClient\Document::OPTION_WAIT_FOR_SYNC - 'waitForSync' - - waitForSync option index - - - - - OPTION_POLICY - \ArangoDBClient\Document::OPTION_POLICY - 'policy' - - policy option index - - - - - OPTION_KEEPNULL - \ArangoDBClient\Document::OPTION_KEEPNULL - 'keepNull' - - keepNull option index - - - - - $_id - \ArangoDBClient\Document::_id - - - The document id (might be NULL for new documents) - - - string - - - - - $_key - \ArangoDBClient\Document::_key - - - The document key (might be NULL for new documents) - - - string - - - - - $_rev - \ArangoDBClient\Document::_rev - - - The document revision (might be NULL for new documents) - - - mixed - + + boolean + - - $_values - \ArangoDBClient\Document::_values + + $_batches + \ArangoDBClient\Connection::_batches array() - - The document attributes (names/values) + + Batches Array - + array - - $_changed - \ArangoDBClient\Document::_changed - false - - Flag to indicate whether document was changed locally + + $_activeBatch + \ArangoDBClient\Connection::_activeBatch + + + $_activeBatch object - - boolean + + \ArangoDBClient\Batch - - $_isNew - \ArangoDBClient\Document::_isNew - true - - Flag to indicate whether document is a new document (never been saved to the server) + + $_captureBatch + \ArangoDBClient\Connection::_captureBatch + false + + $_captureBatch boolean - + boolean - - $_doValidate - \ArangoDBClient\Document::_doValidate + + $_batchRequest + \ArangoDBClient\Connection::_batchRequest false - - Flag to indicate whether validation of document values should be performed -This can be turned on, but has a performance penalty + + $_batchRequest boolean - + boolean - - $_hiddenAttributes - \ArangoDBClient\Document::_hiddenAttributes - array() - - An array, that defines which attributes should be treated as hidden. - - - array - - - - - $_ignoreHiddenAttributes - \ArangoDBClient\Document::_ignoreHiddenAttributes - false - - Flag to indicate whether hidden attributes should be ignored or included in returned data-sets + + $_database + \ArangoDBClient\Connection::_database + '' + + $_database string - - boolean + + string - + __construct - \ArangoDBClient\Document::__construct() - - Constructs an empty document + \ArangoDBClient\Connection::__construct() + + Set up the connection object, validate the options provided - + + \ArangoDBClient\Exception + + array $options - null + array - \ArangoDBClient\Document - - createFromArray - \ArangoDBClient\Document::createFromArray() - - Factory method to construct a new document using the values passed to populate it + + __destruct + \ArangoDBClient\Connection::__destruct() + + Close existing connection handle if a keep-alive connection was used - - \ArangoDBClient\ClientException + + void - - array + + + + setOption + \ArangoDBClient\Connection::setOption() + + Set an option set for the connection + + + \ArangoDBClient\ClientException - - array + + string - - \ArangoDBClient\Document - \ArangoDBClient\Edge - \ArangoDBClient\Graph + + string - $values + $name - array + string - $options - array() - array + $value + + string - \ArangoDBClient\Document - - - __clone - \ArangoDBClient\Document::__clone() - - Clone a document - Returns the clone - - - void - - - \ArangoDBClient\Document - - __toString - \ArangoDBClient\Document::__toString() - - Get a string representation of the document. - It will not output hidden attributes. - -Returns the document as JSON-encoded string - - - string + + getOptions + \ArangoDBClient\Connection::getOptions() + + Get the options set for the connection + + + \ArangoDBClient\ConnectionOptions - \ArangoDBClient\Document - - toJson - \ArangoDBClient\Document::toJson() - - Returns the document as JSON-encoded string + + getOption + \ArangoDBClient\Connection::getOption() + + Get an option set for the connection - - array + + \ArangoDBClient\ClientException - + string + + mixed + - $options - array() - array + $name + + string - \ArangoDBClient\Document - - toSerialized - \ArangoDBClient\Document::toSerialized() - - Returns the document as a serialized string + + get + \ArangoDBClient\Connection::get() + + Issue an HTTP GET request - - array + + \ArangoDBClient\Exception - + string + + array + + + \ArangoDBClient\HttpResponse + - $options + $url + + string + + + $customHeaders array() array - \ArangoDBClient\Document - - filterHiddenAttributes - \ArangoDBClient\Document::filterHiddenAttributes() - - Returns the attributes with the hidden ones removed + + post + \ArangoDBClient\Connection::post() + + Issue an HTTP POST request with the data provided - - array + + \ArangoDBClient\Exception - - array + + string - + + string + + array + + \ArangoDBClient\HttpResponse + - $attributes + $url - array + string - $_hiddenAttributes + $data + + string + + + $customHeaders array() array - \ArangoDBClient\Document - - set - \ArangoDBClient\Document::set() - - Set a document attribute - The key (attribute name) must be a string. -This will validate the value of the attribute and might throw an -exception if the value is invalid. - - \ArangoDBClient\ClientException + + put + \ArangoDBClient\Connection::put() + + Issue an HTTP PUT request with the data provided + + + \ArangoDBClient\Exception - + string - - mixed + + string - - void + + array + + + \ArangoDBClient\HttpResponse - $key + $url string - $value + $data - mixed + string + + + $customHeaders + array() + array - \ArangoDBClient\Document - - __set - \ArangoDBClient\Document::__set() - - Set a document attribute, magic method - This is a magic method that allows the object to be used without -declaring all document attributes first. -This function is mapped to set() internally. - - \ArangoDBClient\ClientException + + head + \ArangoDBClient\Connection::head() + + Issue an HTTP Head request with the data provided + + + \ArangoDBClient\Exception - - + string - - mixed + + array - - void + + \ArangoDBClient\HttpResponse - $key + $url string - $value - - mixed + $customHeaders + array() + array - \ArangoDBClient\Document - - get - \ArangoDBClient\Document::get() - - Get a document attribute + + patch + \ArangoDBClient\Connection::patch() + + Issue an HTTP PATCH request with the data provided - + + \ArangoDBClient\Exception + + string - - mixed + + string + + + array + + + \ArangoDBClient\HttpResponse - $key + $url string - \ArangoDBClient\Document - - - __get - \ArangoDBClient\Document::__get() - - Get a document attribute, magic method - This function is mapped to get() internally. - - - string - - - mixed - - - $key + $data string - \ArangoDBClient\Document + + $customHeaders + array() + array + - - __isset - \ArangoDBClient\Document::__isset() - - Is triggered by calling isset() or empty() on inaccessible properties. + + delete + \ArangoDBClient\Connection::delete() + + Issue an HTTP DELETE request with the data provided - + + \ArangoDBClient\Exception + + string - - boolean + + array + + + string + + + \ArangoDBClient\HttpResponse - $key + $url string - \ArangoDBClient\Document - - - __unset - \ArangoDBClient\Document::__unset() - - Magic method to unset an attribute. - Caution!!! This works only on the first array level. -The preferred method to unset attributes in the database, is to set those to null and do an update() with the option: 'keepNull' => false. - - - - $key - - + $customHeaders + array() + array + + + $data + '' + string - \ArangoDBClient\Document - - getAll - \ArangoDBClient\Document::getAll() - - Get all document attributes + + handleFailover + \ArangoDBClient\Connection::handleFailover() + + Execute the specified callback, and try again if it fails because +the target server is not available. In this case, try again with failing +over to an alternative server (the new leader) until the maximum number +of failover attempts have been made - + + \ArangoDBClient\Exception + + mixed - - array + + \ArangoDBClient\HttpResponse - $options - array() + $cb + mixed - \ArangoDBClient\Document - - getAllForInsertUpdate - \ArangoDBClient\Document::getAllForInsertUpdate() - - Get all document attributes for insertion/update + + updateHttpHeader + \ArangoDBClient\Connection::updateHttpHeader() + + Recalculate the static HTTP header string used for all HTTP requests in this connection - - mixed - - \ArangoDBClient\Document - - getAllAsObject - \ArangoDBClient\Document::getAllAsObject() - - Get all document attributes, and return an empty object if the documentapped into a DocumentWrapper class - - - mixed - - - mixed + + getHandle + \ArangoDBClient\Connection::getHandle() + + Get a connection handle + If keep-alive connections are used, the handle will be stored and re-used + + \ArangoDBClient\ClientException + + + \ArangoDBClient\ConnectException + + + resource - - $options - array() - mixed - - \ArangoDBClient\Document - - setHiddenAttributes - \ArangoDBClient\Document::setHiddenAttributes() - - Set the hidden attributes -$cursor + + closeHandle + \ArangoDBClient\Connection::closeHandle() + + Close an existing connection handle - + + void + + + + + executeRequest + \ArangoDBClient\Connection::executeRequest() + + Execute an HTTP request and return the results + This function will throw if no connection to the server can be established or if +there is a problem during data exchange with the server. + +will restore it. + + \ArangoDBClient\Exception + + + string + + + string + + + string + + array - - void + + \ArangoDBClient\HttpResponse - $attributes + $method + + string + + + $url + + string + + + $data + string + + + $customHeaders + array() array - \ArangoDBClient\Document - - getHiddenAttributes - \ArangoDBClient\Document::getHiddenAttributes() - - Get the hidden attributes + + parseResponse + \ArangoDBClient\Connection::parseResponse() + + Parse the response return the body values as an assoc array - - array + + \ArangoDBClient\Exception + + + \ArangoDBClient\HttpResponse + + + \ArangoDBClient\HttpResponse - \ArangoDBClient\Document + + $response + + \ArangoDBClient\HttpResponse + - - isIgnoreHiddenAttributes - \ArangoDBClient\Document::isIgnoreHiddenAttributes() - - + + stopCaptureBatch + \ArangoDBClient\Connection::stopCaptureBatch() + + Stop capturing commands - - boolean + + \ArangoDBClient\Batch - \ArangoDBClient\Document - - setIgnoreHiddenAttributes - \ArangoDBClient\Document::setIgnoreHiddenAttributes() - - + + setActiveBatch + \ArangoDBClient\Connection::setActiveBatch() + + Sets the active Batch for this connection - - boolean + + \ArangoDBClient\Batch + + + \ArangoDBClient\Batch - $ignoreHiddenAttributes + $batch - boolean + \ArangoDBClient\Batch - \ArangoDBClient\Document - - setChanged - \ArangoDBClient\Document::setChanged() - - Set the changed flag + + getActiveBatch + \ArangoDBClient\Connection::getActiveBatch() + + returns the active batch - - boolean + + \ArangoDBClient\Batch - + + + + setCaptureBatch + \ArangoDBClient\Connection::setCaptureBatch() + + Sets the batch capture state (true, if capturing) + + boolean - $value + $state boolean - \ArangoDBClient\Document - - - getChanged - \ArangoDBClient\Document::getChanged() - - Get the changed flag - - - boolean - - - \ArangoDBClient\Document - - setIsNew - \ArangoDBClient\Document::setIsNew() - - Set the isNew flag + + setBatchRequest + \ArangoDBClient\Connection::setBatchRequest() + + Sets connection into Batch-request mode. This is needed for some operations to act differently when in this mode. - + boolean - - void - - $isNew + $state boolean - \ArangoDBClient\Document - - getIsNew - \ArangoDBClient\Document::getIsNew() - - Get the isNew flag + + isInBatchCaptureMode + \ArangoDBClient\Connection::isInBatchCaptureMode() + + Returns true if this connection is in Batch-Capture mode - + boolean - \ArangoDBClient\Document - - setInternalId - \ArangoDBClient\Document::setInternalId() - - Set the internal document id - This will throw if the id of an existing document gets updated to some other id - - \ArangoDBClient\ClientException + + getBatches + \ArangoDBClient\Connection::getBatches() + + returns the active batch + + + + + doBatch + \ArangoDBClient\Connection::doBatch() + + This is a helper function to executeRequest that captures requests if we're in batch mode + + + mixed - + string - - void + + mixed + + + \ArangoDBClient\ClientException - $id + $method + + mixed + + + $request string - \ArangoDBClient\Document - - setInternalKey - \ArangoDBClient\Document::setInternalKey() - - Set the internal document key - This will throw if the key of an existing document gets updated to some other key - - \ArangoDBClient\ClientException - - - string + + detect_utf + \ArangoDBClient\Connection::detect_utf() + + This function checks that the encoding of a string is utf. + It only checks for printable characters. + + array - - void + + boolean - $key + $string - string + array - \ArangoDBClient\Document - - - getInternalId - \ArangoDBClient\Document::getInternalId() - - Get the internal document id (if already known) - Document ids are generated on the server only. Document ids consist of collection id and -document id, in the format collectionId/documentId - - string - - - \ArangoDBClient\Document - - getInternalKey - \ArangoDBClient\Document::getInternalKey() - - Get the internal document key (if already known) - - - string - - - \ArangoDBClient\Document - - - getHandle - \ArangoDBClient\Document::getHandle() - - Convenience function to get the document handle (if already known) - is an alias to getInternalId() - Document handles are generated on the server only. Document handles consist of collection id and -document id, in the format collectionId/documentId - - string + + check_encoding + \ArangoDBClient\Connection::check_encoding() + + This function checks that the encoding of the keys and +values of the array are utf-8, recursively. + It will raise an exception if it encounters wrong encoded strings. + + array - - \ArangoDBClient\Document - - - getId - \ArangoDBClient\Document::getId() - - Get the document id (or document handle) if already known. - It is a string and consists of the collection's name and the document key (_key attribute) separated by /. -Example: (collectionname/documentId) - -The document handle is stored in a document's _id attribute. - - mixed + + \ArangoDBClient\ClientException - \ArangoDBClient\Document + + $data + + array + - - getKey - \ArangoDBClient\Document::getKey() - - Get the document key (if already known). - Alias function for getInternalKey() - + + json_encode_wrapper + \ArangoDBClient\Connection::json_encode_wrapper() + + This is a json_encode() wrapper that also checks if the data is utf-8 conform. + internally it calls the check_encoding() method. If that method does not throw +an Exception, this method will happily return the json_encoded data. + mixed - - \ArangoDBClient\Document - - - getCollectionId - \ArangoDBClient\Document::getCollectionId() - - Get the collection id (if already known) - Collection ids are generated on the server only. Collection ids are numeric but might be -bigger than PHP_INT_MAX. To reliably store a collection id elsewhere, a PHP string should be used - + mixed - - \ArangoDBClient\Document - - - setRevision - \ArangoDBClient\Document::setRevision() - - Set the document revision - Revision ids are generated on the server only. - -Document ids are strings, even if they look "numeric" -To reliably store a document id elsewhere, a PHP string must be used - - mixed + + string - - void + + \ArangoDBClient\ClientException - $rev + $data mixed - \ArangoDBClient\Document - - - getRevision - \ArangoDBClient\Document::getRevision() - - Get the document revision (if already known) - - - mixed - - - \ArangoDBClient\Document - - - jsonSerialize - \ArangoDBClient\Document::jsonSerialize() - - Get all document attributes -Alias function for getAll() - it's necessary for implementing JsonSerializable interface - - - mixed - - - array - - $options - array() + 0 mixed - \ArangoDBClient\Document - - - - - user - - - string - - - + + setDatabase + \ArangoDBClient\Connection::setDatabase() + + Set the database to use with this connection + Sets the database to use with this connection, for example: 'my_database'<br> +Further calls to the database will be addressed to the given database. + string - - - - - - passwd - - - mixed|null - - - - mixed - null + + $database + + string + + + + getDatabase + \ArangoDBClient\Connection::getDatabase() + + Get the database to use with this connection, for example: 'my_database' + + + string - - - - - - active - - - mixed|null - - - - mixed - null + + + test + \ArangoDBClient\Connection::test() + + Test if a connection can be made using the specified connection options, +i.e. endpoint (host/port), username, password + + + boolean - - - - - - extra - - - array|null + + + getCurrentEndpoint + \ArangoDBClient\Connection::getCurrentEndpoint() + + Returns the current endpoint we are currently connected to +(or, if no connection has been established yet, the next endpoint +that we will connect to) + + + string - - - array - null + + + + notify + \ArangoDBClient\Connection::notify() + + Calls the notification callback function to inform to make the +client application aware of some failure so it can do something +appropriate (e.g. logging) + + + void - + + $message + + + + - eJyFkM1OwzAQhO9+ir0VIkQFxxSJvwpxQeoFTpHQ1lmloY5trW1oBLw764RWKgXh436zszO+uPQrr9S0KBQUcM1oGze/gcX9ArRpycYSQmsbQ5ACMdROp06mIs76K496jQ0B7FZvh60BYoorx8LgTuAaHrAnHohY6rwEcHZ6LpOpUhY7CmJHP5xmu3BPaBKBW76QjsDkmYJwCQe4zfj4a0Z2njj2ECJndX65zD7s2g3VHzYZAx5DeKv/xKhj+0r7GJmxHzFtIuP/n3P4BdrI3bGCeJCtA8y3Vd6V+lSj4hlNi+Eo68pymJzApJJqcsqG6vvUssqCyfFMfQHFdZsR + + Argument $message is missing from the Docblock of notify + + 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 - + - ArangoDB PHP client: bind variables + ArangoDB PHP client: connection + - + - BindVars - \ArangoDBClient\BindVars - - A simple container for bind variables - This container also handles validation of the bind values.<br> -<br> - - + TraceResponse + \ArangoDBClient\TraceResponse + + Class TraceResponse + + + + - - $_values - \ArangoDBClient\BindVars::_values + + $_headers + \ArangoDBClient\TraceResponse::_headers array() - - Current bind values + + Stores each header as an array (key => value) element - + array - - getAll - \ArangoDBClient\BindVars::getAll() - - Get all registered bind variables + + $_httpCode + \ArangoDBClient\TraceResponse::_httpCode + + + The http status code - - array + + integer - - - getCount - \ArangoDBClient\BindVars::getCount() - - Get the number of bind variables registered + + + $_body + \ArangoDBClient\TraceResponse::_body + + + The raw body of the response - - integer + + string - - - set - \ArangoDBClient\BindVars::set() - - Set the value of a single bind variable or set all bind variables at once - This will also validate the bind values. - -Allowed value types for bind parameters are string, int, -double, bool and array. Arrays must not contain any other -than these types. - - \ArangoDBClient\ClientException - - + + + $_type + \ArangoDBClient\TraceResponse::_type + 'response' + + The type of http message + + string - integer + + + + + $_timeTaken + \ArangoDBClient\TraceResponse::_timeTaken + + + The time taken to send and receive a response in seconds + + + float + + + + + $_httpCodeDefinitions + \ArangoDBClient\TraceResponse::_httpCodeDefinitions + array(100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported') + + Used to look up the definition for an http code + + array - - string + + + + __construct + \ArangoDBClient\TraceResponse::__construct() + + Set up the response trace + + + array - - void + + integer + + + string + - $name + $headers - string|integer|array + array - $value - null + $httpCode + + integer + + + $body + string + + $timeTaken + + + - - get - \ArangoDBClient\BindVars::get() - - Get the value of a bind variable with a specific name + + getHeaders + \ArangoDBClient\TraceResponse::getHeaders() + + Get an array of the response headers - + + array + + + + + getHttpCode + \ArangoDBClient\TraceResponse::getHttpCode() + + Get the http response code + + + integer + + + + + getHttpCodeDefinition + \ArangoDBClient\TraceResponse::getHttpCodeDefinition() + + Get the http code definition + + + \ArangoDBClient\ClientException + + string - - mixed + + + + getBody + \ArangoDBClient\TraceResponse::getBody() + + Get the response body + + + string - - $name - - string - + + + getType + \ArangoDBClient\TraceResponse::getType() + + Get the http message type + + + string + + + + + getTimeTaken + \ArangoDBClient\TraceResponse::getTimeTaken() + + Get the time taken for this request + + - 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 - + - ArangoDB PHP client: collection handler + ArangoDB PHP client: autoloader - - \ArangoDBClient\Handler - CollectionHandler - \ArangoDBClient\CollectionHandler - - Provides management of collections - The collection handler fetches collection data from the server and -creates collections on the server. - - - + + + Autoloader + \ArangoDBClient\Autoloader + + Handles automatic loading of missing class files. + The autoloader can be nested with other autoloaders. It will only +process classes from its own namespace and ignore all others.<br> +<br> + + - - ENTRY_DOCUMENTS - \ArangoDBClient\CollectionHandler::ENTRY_DOCUMENTS - 'documents' - - documents array index + + EXTENSION + \ArangoDBClient\Autoloader::EXTENSION + '.php' + + Class file extension - - OPTION_COLLECTION - \ArangoDBClient\CollectionHandler::OPTION_COLLECTION - 'collection' - - collection parameter + + $libDir + \ArangoDBClient\Autoloader::libDir + + + Directory with library files + + string + - - - OPTION_EXAMPLE - \ArangoDBClient\CollectionHandler::OPTION_EXAMPLE - 'example' - - example parameter - - - - - OPTION_NEW_VALUE - \ArangoDBClient\CollectionHandler::OPTION_NEW_VALUE - 'newValue' + + + init + \ArangoDBClient\Autoloader::init() - example parameter + Initialise the autoloader + + \ArangoDBClient\Exception + + + void + - - - OPTION_CREATE_COLLECTION - \ArangoDBClient\CollectionHandler::OPTION_CREATE_COLLECTION - 'createCollection' - - example parameter - + + + load + \ArangoDBClient\Autoloader::load() + + Handle loading of an unknown class + This will only handle class from its own namespace and ignore all others. + +This allows multiple autoloaders to be used in a nested fashion. + + string + + + void + - - - OPTION_ATTRIBUTE - \ArangoDBClient\CollectionHandler::OPTION_ATTRIBUTE - 'attribute' - - attribute parameter - + + $className + + string + + + + checkEnvironment + \ArangoDBClient\Autoloader::checkEnvironment() + + Check the runtime environment + This will check whether the runtime environment is compatible with the +Arango PHP client. + + \ArangoDBClient\ClientException + + + void + - - - OPTION_KEYS - \ArangoDBClient\CollectionHandler::OPTION_KEYS - 'keys' - - keys parameter + + + eJyVVttu2zgQffdXTIGglgOvnAZIH9x4N15HaFygaZAERRcIIFAyLXFDkVqSshO0/fcOKcmi5QaL6MGiNbczM2dGOv+rzMvBYHJ8PIBjmCsiMnn5N9xc3UDKGRVmCqQykkuyogpVrNZFSdJHklGAncHC6TohqudSoQw+EQF3htKCCOFEqSyfFctyA4vd6fTk3ekYjGLoUGj4WCRXYxRzmQk6ho9UofUzWk8GA0EKqjE27YX9sMN/RcSKU+0gF8SwFCxwJjKQayiY1vaYcqI1rBkqhk1G9zn10oQUgScUBNWGrmDLTA7S5CjodHQIS4MizkEKbgFCqWRK0bPzjyDWShbAjAa5FdBhR4jAMiEVHq21dazD80T9aZ009/8vM6aSWhHASXjq6lPnNe+69X1gxa409jqGS6ZoaqR6rnPiLFEE/7hSNDqt6sWGKNDYFpE1jybuXiq2IYaiyJX3CH2gV+xAL9RiV2SgTwY7y6TYc5RKoQ1E3+6j67vll2uYwTBEKg4PXS0FM4xwpimYvT71IZtcya2G6CmlpeniwYWiplICNpKt9pOpEo5JNLmsK5FaM2AYMBg5jbqE9tKUr6fTNKfpYyQ2TElRYCuCUYO3U2lKggnF8eXyNo4hBLxHi/svt//Ed9HN/HaOR9+u5HGbVaxoxpB2Kojj6/nn6O5mvoicj+FD19rp1N6HGNza/zwoWT0HPvmR0ZV4FJaKjie92t3nTHdshry2byblNTz+nV8U274UFTes5H4HNRhpJ63SOGdMAGlnbk10jq3ou8ORUKRoeAlHDt81IoI/HDCbaI25duuCrPo+XskG6yToQvV5cdRVxHa837OH4YdOlVOR4dzhNbM54N+gM/eZNJm0J7aGQFcJansYxnAybr2N4M1s5qEYedis8YmTo30p9Z4Lz8S3sVddoQ74zz1k9XhgO3F+c7KhWGmKrMIuY+MSukZG7NTtJlQm2J8MC0hUnPsZK/pfhdupN0Mh/Cb3XeJho71bIi+Nw8JOrVseqhKGIVFoN8IvToKbddjm1K3+F6wBtVNZlMiZBKnt9iqqtt7qxe29Tg8Y3SyterO/YnXt7+EdWw8XVI+vuEdNcFSQf6XCUhYMB3iEdKRPJZcrGgzD4djCjb9Gt7akfo8snQImzAhqeziHM/jxo/dwht09g7dvoX1qQ6Dq+wOaudRx4rf97IPhUnhFtdXzSh7ihi/xPWZXgBWdhe8BI+T4OUFVuxNrItS/SAhHnxhfIkQH/hp1z8c4p+0HyEPzqk28bWt9/gJGybR/ + + + + ArangoDB PHP client: server exception + + + + + + + \ArangoDBClient\Exception + ServerException + \ArangoDBClient\ServerException + + Server-Exception + This exception type will be thrown by the client when the server returns an +error in response to a client request. + +The exception code is the HTTP status code as returned by +the server. +In case the server provides additional details +about the error, these details can be queried using the +getDetails() function.<br> +<br> + + + + + + ENTRY_CODE + \ArangoDBClient\ServerException::ENTRY_CODE + 'errorNum' + + Error number index - - OPTION_LEFT - \ArangoDBClient\CollectionHandler::OPTION_LEFT - 'left' - - left parameter + + ENTRY_MESSAGE + \ArangoDBClient\ServerException::ENTRY_MESSAGE + 'errorMessage' + + Error message index - - OPTION_RIGHT - \ArangoDBClient\CollectionHandler::OPTION_RIGHT - 'right' - - right parameter + + $_details + \ArangoDBClient\ServerException::_details + array() + + Optional details for the exception + + array + - - - OPTION_CLOSED - \ArangoDBClient\CollectionHandler::OPTION_CLOSED - 'closed' - - closed parameter + + + $enableLogging + \ArangoDBClient\Exception::enableLogging + false + + - - - OPTION_LATITUDE - \ArangoDBClient\CollectionHandler::OPTION_LATITUDE - 'latitude' - - latitude parameter + + + __toString + \ArangoDBClient\ServerException::__toString() + + Return a string representation of the exception + + string + - - - OPTION_LONGITUDE - \ArangoDBClient\CollectionHandler::OPTION_LONGITUDE - 'longitude' - - longitude parameter - + + + setDetails + \ArangoDBClient\ServerException::setDetails() + + Set exception details + If the server provides additional details about the error +that occurred, they will be put here. + + array + + + void + - - - OPTION_DISTANCE - \ArangoDBClient\CollectionHandler::OPTION_DISTANCE - 'distance' - - distance parameter - + + $details + + array + + + + getDetails + \ArangoDBClient\ServerException::getDetails() + + Get exception details + If the server has provided additional details about the error +that occurred, they can be queries using the method + + array + - - - OPTION_RADIUS - \ArangoDBClient\CollectionHandler::OPTION_RADIUS - 'radius' - - radius parameter - + + + getServerCode + \ArangoDBClient\ServerException::getServerCode() + + Get server error code + If the server has provided additional details about the error +that occurred, this will return the server error code + + integer + - - - OPTION_SKIP - \ArangoDBClient\CollectionHandler::OPTION_SKIP - 'skip' - - skip parameter - + + + getServerMessage + \ArangoDBClient\ServerException::getServerMessage() + + Get server error message + If the server has provided additional details about the error +that occurred, this will return the server error string + + string + - - - OPTION_INDEX - \ArangoDBClient\CollectionHandler::OPTION_INDEX - 'index' - - index parameter - - - - - OPTION_LIMIT - \ArangoDBClient\CollectionHandler::OPTION_LIMIT - 'limit' - - limit parameter - - - - - OPTION_FIELDS - \ArangoDBClient\CollectionHandler::OPTION_FIELDS - 'fields' - - fields + + + __construct + \ArangoDBClient\Exception::__construct() + + Exception constructor. + + string + + + integer + + + \Exception + - - - OPTION_UNIQUE - \ArangoDBClient\CollectionHandler::OPTION_UNIQUE - 'unique' - - unique + + $message + '' + string + + + $code + 0 + integer + + + $previous + null + \Exception + + \ArangoDBClient\Exception + + + enableLogging + \ArangoDBClient\Exception::enableLogging() + + Turn on exception logging - - - OPTION_TYPE - \ArangoDBClient\CollectionHandler::OPTION_TYPE - 'type' - - type + \ArangoDBClient\Exception + + + disableLogging + \ArangoDBClient\Exception::disableLogging() + + Turn off exception logging - - - OPTION_SIZE - \ArangoDBClient\CollectionHandler::OPTION_SIZE - 'size' - - size option + \ArangoDBClient\Exception + + + eJzNVk1v2kAQvfMr5hAJiICkOZI0bUoQadV8KOZSJZG12ANe1azd3TUJqvrfO7teG+MASVOpKhcb78yb2ffejn3yIY3SRuNgf78B+3AmmZgl55/g5uIGgpij0H1QKBcoAZ8CTDVPBAWa2I8pC76zGQKUaQObYRdZpqNE0hp8YQI8jThnQtilIEmXks8iDYPy7ujw3VEHtOQEKBSM5pOLDi3HyUxgB0YoKXtJ2QeNhmBzVFQba2WPy114tuHusNbwOOJqtQvQyxThkccxTBB0JJNHAZMl3aHbOTxGKOx/x4BEnUnqjtl9oJS0QS7osUoToQgkAVbkSvyRodK9sjZWSgdJiEDNGOyL8fgGlGY6U/lzplwhDKkfk7xqwcDBZwJgptyqs1QmCx4itRaG3JRgMYSoGY+VyWCTJNM23jbdMbcE4CIITRgOqGHJqWimuJiZEJM6Q32eh7XaMM1EYNB7JxN5albddc0OG8xAgIHxyWHvyGoYxEwpJ1OpEvGjUYQKVrr9bBgDWVXNbx+u0/XNwZQk0FVuXWSRQF1JNgcmJVu6Zwf2mkq+YBphzy+g3sPdA3moVnFoVRbZfIJG7BCf1mACEl7D8Gp8+80fXJ8PCaVpOb7K5s1taORfZZjaDXc59Lyz0QrxMs/agHpr7ULeU3SASDqJKXmSyGeW12S6m6LcbUVydzPKOnnZJOZBaQfwfZ14NqvVtgG5cObnwH1/8PXM83wfetDsQ5Mue5rOY/eUDJYbYUDmJ4/Rem3ZbbzVPraov57t30NdOVyl79d2+Xn6yvNSPywFgI6YhiQIMikxtCdoWU6PlBIilNjb4T7YKwp03QPS5aWuC20WCQ93KqBWx3S9Wl0PR2vF9UXkNnZHf8xuRCPMMRz+JcNro0mtRhOdIXq/hFvoyimo8Lze9WYKq5Nus4lr3O0irHhn2vNuxvo/IYxeKdaSrt9Kha2NFJRxemd1t0ZvZax6dGuk8Sm0uCJjtmq83SmMp/3+amg+tNuVvO2EP088LrOcDM+Tqcm8vVfL5cbzf6FYPotfnNjb239BuXK2vkk894p6k35F7i4JRRbHhWy0aj8bfBZzplq1j4d+3y52oHlffETeuw+RyX0ttklW+A1ZRFRS + + + + ArangoDB PHP client: user document handler + + + + + + + \ArangoDBClient\Handler + UserHandler + \ArangoDBClient\UserHandler + + A handler that manages users + . +A user-document handler that fetches vertices from the server and +persists them on the server. It does so by issuing the +appropriate HTTP requests to the server. + + + + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object + + \ArangoDBClient\Connection + - - - OPTION_GEO_INDEX - \ArangoDBClient\CollectionHandler::OPTION_GEO_INDEX - 'geo' - - geo index option + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + + string + - - - OPTION_GEOJSON - \ArangoDBClient\CollectionHandler::OPTION_GEOJSON - 'geoJson' - - geoJson option + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + string + - - - OPTION_HASH_INDEX - \ArangoDBClient\CollectionHandler::OPTION_HASH_INDEX - 'hash' - - hash index option - + + + addUser + \ArangoDBClient\UserHandler::addUser() + + save a user to the user-collection + This will save the user to the users collection. It will additionally grant the user permissions +for the current database + +This will throw if the user cannot be saved + + \ArangoDBClient\Exception + + + string + + + mixed + + + mixed + + + array + + + boolean + + - - - OPTION_FULLTEXT_INDEX - \ArangoDBClient\CollectionHandler::OPTION_FULLTEXT_INDEX - 'fulltext' - - fulltext index option - + + $username + + string + + + $passwd + null + mixed + + + $active + null + mixed + + + $extra + null + array + + + + replaceUser + \ArangoDBClient\UserHandler::replaceUser() + + Replace an existing user, identified by its username + This will replace the user-document on the server + +This will throw if the document cannot be replaced + + \ArangoDBClient\Exception + + + string + + + mixed + + + mixed + + + array + + + boolean + - - - OPTION_MIN_LENGTH - \ArangoDBClient\CollectionHandler::OPTION_MIN_LENGTH - 'minLength' - - minLength option - - - - - OPTION_SKIPLIST_INDEX - \ArangoDBClient\CollectionHandler::OPTION_SKIPLIST_INDEX - 'skiplist' - - skiplist index option - - - - - OPTION_PERSISTENT_INDEX - \ArangoDBClient\CollectionHandler::OPTION_PERSISTENT_INDEX - 'persistent' - - persistent index option - - - - - OPTION_SPARSE - \ArangoDBClient\CollectionHandler::OPTION_SPARSE - 'sparse' - - sparse index option - - - - - OPTION_COUNT - \ArangoDBClient\CollectionHandler::OPTION_COUNT - 'count' - - count option - - - - - OPTION_QUERY - \ArangoDBClient\CollectionHandler::OPTION_QUERY - 'query' - - query option - - - - - OPTION_CHECKSUM - \ArangoDBClient\CollectionHandler::OPTION_CHECKSUM - 'checksum' - - checksum option - - - - - OPTION_REVISION - \ArangoDBClient\CollectionHandler::OPTION_REVISION - 'revision' - - revision option - - - - - OPTION_PROPERTIES - \ArangoDBClient\CollectionHandler::OPTION_PROPERTIES - 'properties' - - properties option - - - - - OPTION_FIGURES - \ArangoDBClient\CollectionHandler::OPTION_FIGURES - 'figures' - - figures option - - - - - OPTION_LOAD - \ArangoDBClient\CollectionHandler::OPTION_LOAD - 'load' - - load option - - - - - OPTION_UNLOAD - \ArangoDBClient\CollectionHandler::OPTION_UNLOAD - 'unload' - - unload option - - - - - OPTION_TRUNCATE - \ArangoDBClient\CollectionHandler::OPTION_TRUNCATE - 'truncate' - - truncate option - - - - - OPTION_RENAME - \ArangoDBClient\CollectionHandler::OPTION_RENAME - 'rename' - - rename option - - - - - OPTION_EXCLUDE_SYSTEM - \ArangoDBClient\CollectionHandler::OPTION_EXCLUDE_SYSTEM - 'excludeSystem' - - exclude system collections - - - - - $_connection - \ArangoDBClient\Handler::_connection - - - Connection object - - - \ArangoDBClient\Connection - - - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - - - - string + + $username + + string + + + $passwd + null + mixed + + + $active + null + mixed + + + $extra + null + array + + + + updateUser + \ArangoDBClient\UserHandler::updateUser() + + Update an existing user, identified by the username + This will update the user-document on the server + +This will throw if the document cannot be updated + + \ArangoDBClient\Exception - - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - - - + string - - - - create - \ArangoDBClient\CollectionHandler::create() - - Creates a new collection on the server - This will add the collection on the server and return its id -The id is mainly returned for backwards compatibility, but you should use the collection name for any reference to the collection. * -This will throw if the collection cannot be created - - \ArangoDBClient\Exception + + mixed - + mixed - + array - - mixed + + boolean - $collection + $username + string + + + $passwd + null mixed - $options - array() + $active + null + mixed + + + $extra + null array - - has - \ArangoDBClient\CollectionHandler::has() - - Check if a collection exists - This will call self::get() internally and checks if there -was an exception thrown which represents an 404 request. - + + get + \ArangoDBClient\UserHandler::get() + + Get a single user-document, identified by the username + This will throw if the document cannot be fetched from the server + \ArangoDBClient\Exception - - mixed + + string - - boolean + + \ArangoDBClient\User - $collection + $username - mixed + string - - count - \ArangoDBClient\CollectionHandler::count() - - Get the number of documents in a collection - This will throw if the collection cannot be fetched from the server - - \ArangoDBClient\Exception - - - mixed - - - integer - - - - $collection - - mixed - - - - get - \ArangoDBClient\CollectionHandler::get() - - Get information about a collection - This will throw if the collection cannot be fetched from the server - + + removeUser + \ArangoDBClient\UserHandler::removeUser() + + Remove a user, identified by the username + + \ArangoDBClient\Exception - - mixed + + string - - \ArangoDBClient\Collection + + boolean - $collection + $username - mixed + string - - getProperties - \ArangoDBClient\CollectionHandler::getProperties() - - Get properties of a collection - This will throw if the collection cannot be fetched from the server - + + grantPermissions + \ArangoDBClient\UserHandler::grantPermissions() + + Grant R/W permissions to a user, for a specific database + + \ArangoDBClient\Exception - - mixed + + string - - \ArangoDBClient\Collection + + string + + + boolean + - $collection + $username - mixed + string - - - figures - \ArangoDBClient\CollectionHandler::figures() - - Get figures for a collection - This will throw if the collection cannot be fetched from the server - - \ArangoDBClient\Exception - - - mixed - - - array - - - $collection + $databaseName - mixed + string - - getChecksum - \ArangoDBClient\CollectionHandler::getChecksum() - - Calculate a checksum of the collection. - Will calculate a checksum of the meta-data (keys and optionally revision ids) -and optionally the document data in the collection. - - \ArangoDBClient\Exception + + grantDatabasePermissions + \ArangoDBClient\UserHandler::grantDatabasePermissions() + + Grant R/W permissions to a user, for a specific database + + + string - - mixed + + string - - boolean + + string - + boolean - - array - - $collectionId + $username - mixed + string - $withRevisions - false - boolean + $databaseName + + string - $withData - false - boolean + $permissions + 'rw' + string - - getRevision - \ArangoDBClient\CollectionHandler::getRevision() - - Returns the Collections revision ID - The revision id is a server-generated string that clients can use to check whether data in a collection has -changed since the last revision check. - + + revokePermissions + \ArangoDBClient\UserHandler::revokePermissions() + + Revoke R/W permissions for a user, for a specific database + + \ArangoDBClient\Exception - - mixed + + string - - array + + string + + + boolean + - $collectionId + $username - mixed + string + + + $databaseName + + string - - rename - \ArangoDBClient\CollectionHandler::rename() - - Rename a collection + + revokeDatabasePermissions + \ArangoDBClient\UserHandler::revokeDatabasePermissions() + + Revoke R/W permissions for a user, for a specific database - + \ArangoDBClient\Exception - - mixed + + string - + string - + boolean - $collection + $username - mixed + string - $name + $databaseName string - - load - \ArangoDBClient\CollectionHandler::load() - - Load a collection into the server's memory - This will load the given collection into the server's memory. - - \ArangoDBClient\Exception + + grantCollectionPermissions + \ArangoDBClient\UserHandler::grantCollectionPermissions() + + Grant R/W permissions to a user, for a specific collection + + + string - - mixed + + string - - \ArangoDBClient\HttpResponse + + string + + + string + + + boolean - $collection + $username - mixed + string - - - unload - \ArangoDBClient\CollectionHandler::unload() - - Unload a collection from the server's memory - This will unload the given collection from the server's memory. - - \ArangoDBClient\Exception - - - mixed - - - \ArangoDBClient\HttpResponse - - - $collection + $databaseName - mixed + string + + + $collectionName + + string + + + $permissions + 'rw' + string - - truncate - \ArangoDBClient\CollectionHandler::truncate() - - Truncate a collection - This will remove all documents from the collection but will leave the metadata and indexes intact. - + + revokeCollectionPermissions + \ArangoDBClient\UserHandler::revokeCollectionPermissions() + + Revoke R/W permissions for a user, for a specific database + + \ArangoDBClient\Exception - - mixed + + string + + + string + + + string - + boolean - $collection + $username - mixed + string + + + $databaseName + + string + + + $collectionName + + string - - drop - \ArangoDBClient\CollectionHandler::drop() - - Drop a collection + + getDatabases + \ArangoDBClient\UserHandler::getDatabases() + + Gets the list of databases a user has access to - + \ArangoDBClient\Exception - - mixed + + string - + array - - boolean - - $collection + $username - mixed - - - $options - array() - array + string - - isValidCollectionId - \ArangoDBClient\CollectionHandler::isValidCollectionId() - - Checks if the collectionId given, is valid. Returns true if it is, or false if it is not. + + getDatabasePermissionLevel + \ArangoDBClient\UserHandler::getDatabasePermissionLevel() + + Gets the list of collections a user has access to - - - boolean + + string + + + string + + + string - $collectionId + $username - + string + + + $databaseName + + string - - getAllCollections - \ArangoDBClient\CollectionHandler::getAllCollections() - - Get list of all available collections per default with the collection names as index. - Returns empty array if none are available. - - array + + getCollectionPermissionLevel + \ArangoDBClient\UserHandler::getCollectionPermissionLevel() + + Gets the list of collections a user has access to + + + string - - array + + string - - \ArangoDBClient\Exception + + string - - \ArangoDBClient\ClientException + + string - $options - array() - array + $username + + string + + + $databaseName + + string + + + $collectionName + + string - - getCollectionId - \ArangoDBClient\CollectionHandler::getCollectionId() - - Gets the collectionId from the given collectionObject or string/integer + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler - - mixed - - - mixed + + \ArangoDBClient\Connection - $collection + $connection - mixed + \ArangoDBClient\Connection + \ArangoDBClient\Handler - - getCollectionName - \ArangoDBClient\CollectionHandler::getCollectionName() - - Gets the collectionId from the given collectionObject or string/integer + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object - - mixed + + \ArangoDBClient\Connection - + + \ArangoDBClient\Handler + + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() + + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection + + + mixed + + \ArangoDBClient\ClientException + - $collection + $optionName - mixed + + \ArangoDBClient\Handler - - importFromFile - \ArangoDBClient\CollectionHandler::importFromFile() - - Import documents from a file - This will throw on all errors except insertion errors - - \ArangoDBClient\Exception - - - mixed - - - mixed - - + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + array - - array + + string + + + \ArangoDBClient\ClientException - $collectionId - - mixed - - - $importFileName + $body - mixed - - - $options - array() array + \ArangoDBClient\Handler - - import - \ArangoDBClient\CollectionHandler::import() - - Import documents into a collection - This will throw on all errors except insertion errors - - - string + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + + Helper function that runs through the options given and includes them into the parameters array given. + Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . + array - + array - - + array - - \ArangoDBClient\Exception - - - \ArangoDBClient\ClientException + + array - $collection + $options - + array - $importData + $body - string|array + array - $options + $includeArray array() array + \ArangoDBClient\Handler - - createHashIndex - \ArangoDBClient\CollectionHandler::createHashIndex() - - Create a hash index + + makeCollection + \ArangoDBClient\Handler::makeCollection() + + Turn a value into a collection name - - string - - - array - - - boolean - - - boolean + + \ArangoDBClient\ClientException - - - array + + mixed - - \ArangoDBClient\Exception + + string - $collectionId + $value - string + mixed - - $fields + \ArangoDBClient\Handler + + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + + array + + + mixed + + + + $headers array - $unique - null - boolean - - - $sparse - null - boolean + $collection + + mixed + \ArangoDBClient\Handler - - createFulltextIndex - \ArangoDBClient\CollectionHandler::createFulltextIndex() - - Create a fulltext index + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use - + string - - array - - - integer - - - - array - - - \ArangoDBClient\Exception + + \ArangoDBClient\DocumentClassable - $collectionId + $class string - - $fields - - array - - - $minLength - null - integer - + \ArangoDBClient\DocumentClassable - - createSkipListIndex - \ArangoDBClient\CollectionHandler::createSkipListIndex() - - Create a skip-list index + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use - + string - - array - - - boolean - - - boolean - - - - array - - - \ArangoDBClient\Exception + + \ArangoDBClient\DocumentClassable - $collectionId + $class string - - $fields - - array - - - $unique - null - boolean - - - $sparse - null - boolean - + \ArangoDBClient\DocumentClassable - - createPersistentIndex - \ArangoDBClient\CollectionHandler::createPersistentIndex() - - Create a persistent index + + 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 + + + + ArangoDB PHP client: AQL query result cache handling + + + + + + + \ArangoDBClient\Handler + QueryCacheHandler + \ArangoDBClient\QueryCacheHandler + + A base class for REST-based handlers + + + + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object + + + \ArangoDBClient\Connection + + + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + - + string - - array + + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + + string - - boolean + + + + enable + \ArangoDBClient\QueryCacheHandler::enable() + + Globally turns on the AQL query result cache + + + \ArangoDBClient\Exception - - boolean + + + + disable + \ArangoDBClient\QueryCacheHandler::disable() + + Globally turns off the AQL query result cache + + + \ArangoDBClient\Exception - - - array + + + + enableDemandMode + \ArangoDBClient\QueryCacheHandler::enableDemandMode() + + Globally sets the AQL query result cache to demand mode + + + \ArangoDBClient\Exception - + + + + clear + \ArangoDBClient\QueryCacheHandler::clear() + + Clears the AQL query result cache for the current database + + \ArangoDBClient\Exception - - $collectionId - - string - - - $fields - - array - - - $unique - null - boolean - - - $sparse - null - boolean - - - createGeoIndex - \ArangoDBClient\CollectionHandler::createGeoIndex() - - Create a geo index + + getEntries + \ArangoDBClient\QueryCacheHandler::getEntries() + + Returns the entries from the query cache in current database - - string + + \ArangoDBClient\Exception - + array - - boolean + + + + setProperties + \ArangoDBClient\QueryCacheHandler::setProperties() + + Adjusts the global AQL query result cache properties + + + \ArangoDBClient\Exception - - + array - - \ArangoDBClient\Exception + + array - $collectionId - - string - - - $fields + $properties array - - $geoJson - null - boolean - - - index - \ArangoDBClient\CollectionHandler::index() - - Creates an index on a collection on the server - This will create an index on the collection on the server and return its id - -This will throw if the index cannot be created - + + getProperties + \ArangoDBClient\QueryCacheHandler::getProperties() + + Returns the AQL query result cache properties + + \ArangoDBClient\Exception - - mixed - - - string - - - array - - - boolean - - - array - - + array - - $collectionId - - mixed - - - $type - - string - - - $attributes - array() - array - - - $unique - false - boolean - - - $indexOptions - array() - array - - - getIndex - \ArangoDBClient\CollectionHandler::getIndex() - - Get the information about an index in a collection + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler - - string - - - string - - - array - - - \ArangoDBClient\Exception - - - \ArangoDBClient\ClientException + + \ArangoDBClient\Connection - $collection - - string - - - $indexId + $connection - string + \ArangoDBClient\Connection + \ArangoDBClient\Handler - - getIndexes - \ArangoDBClient\CollectionHandler::getIndexes() - - Get indexes of a collection - This will throw if the collection cannot be fetched from the server - - \ArangoDBClient\Exception - - - mixed - - - array + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object + + + \ArangoDBClient\Connection - - $collectionId - - mixed - + \ArangoDBClient\Handler - - dropIndex - \ArangoDBClient\CollectionHandler::dropIndex() - - Drop an index + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() + + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection - - \ArangoDBClient\Exception - - + + mixed - - boolean + + \ArangoDBClient\ClientException - $indexHandle + $optionName - mixed + + \ArangoDBClient\Handler - - any - \ArangoDBClient\CollectionHandler::any() - - Get a random document from the collection. - This will throw if the document cannot be fetched from the server - - \ArangoDBClient\Exception + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + + array - - mixed + + string - - \ArangoDBClient\Document + + \ArangoDBClient\ClientException - - $collectionId + $body - mixed + array + \ArangoDBClient\Handler - - all - \ArangoDBClient\CollectionHandler::all() - - Returns all documents of a collection - - - mixed - - + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + + Helper function that runs through the options given and includes them into the parameters array given. + Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . + array - - \ArangoDBClient\Cursor + + array - - \ArangoDBClient\Exception + + array - - \ArangoDBClient\ClientException + + array - $collectionId + $options - mixed + array - $options + $body + + array + + + $includeArray array() array + \ArangoDBClient\Handler - - getAllIds - \ArangoDBClient\CollectionHandler::getAllIds() - - Get the list of all documents' ids from a collection - This will throw if the list cannot be fetched from the server - - \ArangoDBClient\Exception + + makeCollection + \ArangoDBClient\Handler::makeCollection() + + Turn a value into a collection name + + + \ArangoDBClient\ClientException - + mixed - - array + + string - $collection + $value mixed + \ArangoDBClient\Handler - - byExample - \ArangoDBClient\CollectionHandler::byExample() - - Get document(s) by specifying an example - This will throw if the list cannot be fetched from the server - - \ArangoDBClient\Exception - - - mixed - - - mixed - - + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + array - - \ArangoDBClient\cursor + + mixed - - $collectionId + + $headers - mixed + array - $document + $collection mixed - - $options - array() - array - + \ArangoDBClient\Handler - - firstExample - \ArangoDBClient\CollectionHandler::firstExample() - - Get the first document matching a given example. - This will throw if the document cannot be fetched from the server - - \ArangoDBClient\Exception - - - mixed + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use + + + string - - mixed + + \ArangoDBClient\DocumentClassable - - array + + + $class + + string + + \ArangoDBClient\DocumentClassable + + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use + + + string - - \ArangoDBClient\Document + + \ArangoDBClient\DocumentClassable - - $collectionId + $class - mixed - - - $document - - mixed + string + \ArangoDBClient\DocumentClassable + + + + No summary for class \ArangoDBClient\QueryCacheHandler + + eJzVV9tO20AQffdXjBBSEpRAW6kvplDSEBFVVAqpeKigitb2ODFd77q760KE+PfObpz7BdOGByzFt9k5M3M8Z+x8+pwNM887Ojjw4ACaiomBPP8C3U4XQp6gMD40ry7hd45qBAp1zg2ELBwiDJmIeCIG5GddzzIW/mIDBJiitByAM7LcDKUiG3xlAr4bxJQJ4UyhzEYqGQwNtKZnH969/1gHoxICFBou0qBTJzOXA4F1uEBF3iPyPvI8wVLUFBuXwh57XsiZ1nBlU2/ZlDs2Y1SADwZFpKG49h49z2bmOLDbAVxwGTDOR2ByRfGlAEMVryei8Jm4npmhkvca2g8hZiaRojAcuWOWBzwJIc5FaG2AggUcqzVnfBwvpW0/VxxO4FrxDvIMle8HecIjuq7ST/v+de+yf3Xd7v3ot5qtTrsON5VMSVppEtSVn7XjGZQZJrpxOkDTkkKgC1utNU6z3FRtmPpkxZ2Woo8ilBH27xXLCKx6U0npsgInp1CRgnAL4CfvWcri+LU4ixL9dkiL43KsaTR6C2FgJERWMxFY8B303LlD+0Zgb4LIcfELXC5R2eLI1FYOY5pA1hzmStGEgIgZFjD9f2yGNuwuKCxDW4QcDTrmpjzY/TIXPRyr0FZLlSp6LBArmbobY2bGlCTiX9mY2pWLBUwpNoLGNBwhzwVaoHAtj1Rre+y6k34s0lhsxqIbTjbySzcm5E69ivoKZ7fmq7bLNzViM7rLdaHmgdP3poaciealpGdMsRQK0vdnOM7emHvMG+IdTpC2b8aphnN5Ty/6OXfCExAg5BojvxxUA1L20HPZaN+eJ2megsjTgN7IMi4S1WXzYmZTkfcJ5zCUPCoHRRUtt/7zldBY8mEmsTVZUEdLW1dcLwdKi90rIDFLo/4QulLrhCY2/GE8J+6ZKpnonhR7ddrHMR0owN4Ydu9wm4S3DjtKsTttgupK960IN5DRqGtbVVvRzRbOycuJ220vUPiSqDMpNG6Rdam3zVyytQ36d3FKTID58btz6Zd+WIOFh7V2qL4y78+M0010PhWf7n3GE6arKx/wvu/MdajcTv4i3BYf/8HtyuoK4f4FYBu70Q== + + + + ArangoDB PHP client: http helper methods + + + + + + + + HttpHelper + \ArangoDBClient\HttpHelper + + Helper methods for HTTP request/response handling + + + + + + METHOD_POST + \ArangoDBClient\HttpHelper::METHOD_POST + 'POST' + + HTTP POST string constant + + + + + METHOD_PUT + \ArangoDBClient\HttpHelper::METHOD_PUT + 'PUT' + + HTTP PUT string constant + + + + + METHOD_DELETE + \ArangoDBClient\HttpHelper::METHOD_DELETE + 'DELETE' + + HTTP DELETE string constant + + + + + METHOD_GET + \ArangoDBClient\HttpHelper::METHOD_GET + 'GET' + + HTTP GET string constant + + + + + METHOD_HEAD + \ArangoDBClient\HttpHelper::METHOD_HEAD + 'HEAD' + + HTTP HEAD string constant + + + + + METHOD_PATCH + \ArangoDBClient\HttpHelper::METHOD_PATCH + 'PATCH' + + HTTP PATCH string constant + + + + + CHUNK_SIZE + \ArangoDBClient\HttpHelper::CHUNK_SIZE + 8192 + + Chunk size (number of bytes processed in one batch) + + + + + EOL + \ArangoDBClient\HttpHelper::EOL + "\r\n" + + End of line mark used in HTTP + + + + + SEPARATOR + \ArangoDBClient\HttpHelper::SEPARATOR + "\r\n\r\n" + + Separator between header and body + + + + + PROTOCOL + \ArangoDBClient\HttpHelper::PROTOCOL + 'HTTP/1.1' + + HTTP protocol version used, hard-coded to version 1.1 + + + + + MIME_BOUNDARY + \ArangoDBClient\HttpHelper::MIME_BOUNDARY + 'XXXsubpartXXX' + + Boundary string for batch request parts + + + + + ASYNC_HEADER + \ArangoDBClient\HttpHelper::ASYNC_HEADER + 'X-Arango-Async' + + HTTP Header for making an operation asynchronous + + + + + createConnection + \ArangoDBClient\HttpHelper::createConnection() + + Create a one-time HTTP connection by opening a socket to the server + It is the caller's responsibility to close the socket + + \ArangoDBClient\ConnectException + + + \ArangoDBClient\ConnectionOptions + + + resource + + $options - array() - array + + \ArangoDBClient\ConnectionOptions - - fulltext - \ArangoDBClient\CollectionHandler::fulltext() - - Get document(s) by a fulltext query - This will find all documents from the collection that match the fulltext query specified in query. -In order to use the fulltext operator, a fulltext index must be defined for the collection and the specified attribute. - - \ArangoDBClient\Exception + + buildRequest + \ArangoDBClient\HttpHelper::buildRequest() + + Create a request string (header and body) + + + \ArangoDBClient\ConnectionOptions - - mixed + + string - - mixed + + string - - mixed + + string - + + string + + array - - \ArangoDBClient\cursor + + string + + + \ArangoDBClient\ClientException - $collection + $options - mixed + \ArangoDBClient\ConnectionOptions - $attribute + $connectionHeader - mixed + string - $query + $method - mixed + string - $options + $url + + string + + + $body + + string + + + $customHeaders array() array - - updateByExample - \ArangoDBClient\CollectionHandler::updateByExample() - - Update document(s) matching a given example - This will update the document(s) on the server - -This will throw if the document cannot be updated - - \ArangoDBClient\Exception + + validateMethod + \ArangoDBClient\HttpHelper::validateMethod() + + Validate an HTTP request method name + + + \ArangoDBClient\ClientException - - mixed + + string - - mixed + + boolean - - mixed + + + $method + + string + + + + transfer + \ArangoDBClient\HttpHelper::transfer() + + Execute an HTTP request on an opened socket + It is the caller's responsibility to close the socket + + resource - - mixed + + string - - boolean + + string + + + \ArangoDBClient\ClientException + + + string - - $collectionId + $socket - mixed + resource - $example + $request - mixed + string - $newValue + $method - mixed - - - $options - array() - mixed + string - - replaceByExample - \ArangoDBClient\CollectionHandler::replaceByExample() - - Replace document(s) matching a given example - This will replace the document(s) on the server - -This will throw if the document cannot be replaced - - \ArangoDBClient\Exception - - - mixed + + parseHttpMessage + \ArangoDBClient\HttpHelper::parseHttpMessage() + + Splits an http message into its header and body. + + + string - - mixed + + string - - mixed + + string - - mixed + + \ArangoDBClient\ClientException - - boolean + + array - - $collectionId + $httpMessage - mixed + string - $example - - mixed + $originUrl + null + string - $newValue - - mixed + $originMethod + null + string + + + parseHeaders + \ArangoDBClient\HttpHelper::parseHeaders() + + Process a string of HTTP headers into an array of header => values. + + + string + + + array + + - $options - array() - mixed + $headers + + string - - removeByExample - \ArangoDBClient\CollectionHandler::removeByExample() - - Remove document(s) by specifying an example - This will throw on any error - - \ArangoDBClient\Exception + + eJytWvt32sgV/t1/xcTHXUQC+HH27La4pCZYid21wQdwumnscgYxgGohUc3INtvkf++989BbGO/WJyeANPPNfc2931zpr39bL9d7e4dv3+6Rt6QbUn8RnH8gNxc3xPFc5os2WQqxJkvmrVlIVkwsgxmHsTj8bE2dB7pghMQze3KSvEkjGBvCPfJ36pORYGxFfV/ecoL1JnQXS0F68beTo+OTBhGhC4A+J59W04sG3PaChc8a5BMLYfYGZh/u7fl0xTiszXLLnsaKXGTEJXOQ42I8viEh+0/EuDgMYX7gc0aW1J95rr/Ia1SiD3d9B1U9ap1IMRyPck4uwDpqtb3/7qGyUgL8e6uWvBmMxoSDXv6COLCmoIgnBxzKT3mRXNvji8H5RI7ukBp+1kCfUsTb1wDeKrzbSrhz+8oe27sj6vEAqr5V4X6yXyEmDgZE+KiCu7C757vjydEAiJ+VduyOexevsKQcjrbELyWgvWXkPxDu/saI5UerKQRgMCfTjWCcrMPAYZyzGXF9EviMTKlwlvWS1XoXt/1fJqPLf6KJ/3z8l5PiQrY/Q2SIW0ZWNHwgkQZGtUog7cEVYO3fhXf+fhFtxNY0pAK2yJSJJ8Z82Ox0BsLD1iDTYLYpQRzZN91hdzwYGtwKbGln0F0ETuCRRxZyN/CluA3YeuGs6QQzEF0E8b3j1nHJejfDwXjQk2rUEPMQhpV5IGRUMELRwk3hrpgSADB85giEn25IsGY+epwSHjgPTODqYskIZyEIoaEM4qUgLpe3Hep5LKxxonOHO3U9V2xwtuMFkEokhkTMYZyJZRg8cUhmUgz72WFrFCY/DN2wMqPg/kCO4uQg0F+aaU30xTxIyEQU+ihkEIWQr5pGyydXLLWOKZgGXPc8IiUkT0twvh+kV3EgdU8ZgZxJp57Ll2yW8c46gqsO7CEq4GMe+XqW9EOiiVWtlNoCKnXi3wHzZ+vA9QW42oxpvl8w0YvCEFKxrW9b9dNkDggs2DNOgd3M6GqiL0yUIDg2HuzOiWVA2m0AHm/WzIqXrZNOp0OSAeMvN/ZkNLqqp2SUUXcIxhSgcgh+DwmMMB6R1QaDwUBm5uUEBIyJmmcZLRqkxrlXgw9wlTvfTNYM4q4RW+NrwZjt9uBmfDnoTz7bw8uPXyY9ezi+T9kH/85+58ITLLavXn3S717beRFeIwFstuAJhnjzCXeBAcx2E6F7dTX4x2RkX32EDPqpb5/nZcj8wFBw+URVAOtsB/xed/Lx8go0y4fDa/Vz6Nz1drRrvGhWle97BWV2Abu8ubCHo3vyBsLcjzyvTBMIbgxox11DbPM/pqjC2FFTLVxB0xKdD+Zr2O8mrFWSmyjOamVmJ3vZD4BEelCfU9u9kRl7wMKwH+SuAdnkwAlzV1/WZnx5bQ9ux/fZiaPx0O5eT3pXl3Z/POkN+n27N85hayvGF/P56w0on/ebSuE+eyrUGavgQAg/3w+ESfRYw+K0e1erkVZhRpKWW6R2V2sTGJRYRtstMyvlw5TXjLvAV1ifg0hYoMtOwWHMmTaGrnYAoVb7XqAEH4LIn9FwY3geJmfJvcxZgEDZFaaMZmgfrDf5MLjtn3eHX5B4/Prrrzya4nD4VklTFXfCZVb0QfIMrNUMGBZWRso3vgOe8oOobM3u6Eu/J8mrPZRLNtVBpNnFedsYj9FGq2nlOJxhmruTjfhvC+swMHrRdLwkc7RFmsADWROOTGw19YDzaQFTbkmmvAyvTnapK01lfnX95flR6GXi28y/HV69PBkNmpus7EI9aWzcT+uAixwSDUOanXfgRFwEK2UhrpDglKtHYhagruSq2ljMYyvIb1WkT4sKGLGV06defb9AS2XOrGClW2neNHK92VCBb6F4jWI0NIwHG9IVDWXThlY8Z5YO+Xqfp4kyCya1W04vFOVUSszqaNUu/UeoBDMC/0dMJQVAaBH7eY1yghUVcoMsIE9isgOmKCRTVEuVZrcDj/kLoNmSh8J3PTiXvXfIdR/wiHkvqagII5ZXTBUIX1JXTBM99bOJv9tkFXnCxTR1CHqtmjMq6Cmop/JgB3VBXtVuZxOcuQqHxZRuEHJwtNm+eu20hIloS7wnR+SHH3ZJ71JlOFWOldpzCgtXcBNYQG4zOJlBIYEjDBy8lkHkzSQlp0TL10R/6a1TLGhbTUjXawh4mbIP/80Dv1ZuHuX+skBIR7C2kbkHTmEU6o+VC3MKO0YJ+wvbkM578+szhmgxAtILtDrpqVChdX1OAVT4NxEZ7Dp3IYN5mzh9yFOMTh6JaiabQJCvYYuIuVX7EyfyX62wr9Wa5vhezzGLYpVoKUmAnIAXxBI8jM0SSDxQo9URFsopqLDNGNXBmr0Vi298fyVjtq0VURFcTxsu+z27DkZkCTPR1qqiJ58xC8kK7mdztS5wePqqaidsy9u56mXqZXMbrhZ5GgQe1hDviW64TD+ZJgFsPpDV1fkzBSe3Y4QbZ7cmwaNW/VpCWFrEskRvpMe8oFNXqlv67VuerlcMvt19rO5x7jocu5e7jpWdyZ1lxqSYHANySUA7DF1UuqV3qH+5cJPkPxZHUv1avSp27WfmRCWhizRXcl44tpd3xP4vXTUV4HGj60D3ubJ8VV+0VpAhsJGFUtXL90gqtSHEau0xwbKaQYqmeRaVxzDMNENIVYfWYq1Fi+xjBOwXCPnWXV2keFou/RhDX6ay0fzoYk91uil2NbfuRwEnDT5noaUt2YjtEWf1KhZmnGCm/h4mpj2FhqqVsyssS6FIdWyMfPU0wzqbP4WuYEUtUqBn87kX8WUs7mm6cqtioGoBXlFtklS3kUmOyGbxkMIIEQjqDaEcmSsdcpRvV5olbgKubqcrLAcKl6MNB3M3hBAkHb3f4xtPSxdKtaXvf/tG3sxZMK90BaCDXB2wAX5JzKTyTvL0IdeDkXlYTTXsDNdKLkGiKGFrU7j/sLVvlTLWu4Q3I2y9jFdKLctWSqwmJ58WB8QGlNLnhCojumnYViluWQ8uG0Cd7W02Z8mcB5xnOKvmzfrA5+KGZhwfQZbNPj4BbVZwRFxFKxLM50h/LbfFWsaO++ZhCXl+ft6vk2YZCp0Lhh1rKpBJO5pIM7Kflam9XzTOWgYvbkf4ZmlbYdcvO5MAnzo+yfszthiivNnG+eVaJRvTkg17Hk1BgmR1ifeOHP8Eix7VT6WhfkrOZHm1iMnFWxdU29RA/6xQf4ZLAA0XJE2duQu3xFGxnqkqrx5MVumqHRM/tpacQacxOE4neV0RM1UGZtugJHXGeVAf8Ml4lvKqY3ADDvRCIm5D6g/GMfEAPHlsrhyf3wzpNJj++164+v2V+8y0s+VpM5eht+1BydtHeL5QEZKJ4+TRZqMYDvWiKlKuBPDlmE7GQu77UQbVj6lIjZeviNC8nhnAnMRFaV82cQ4/Y+Mkbb/v5CXZuRKULJ4cnNAHVdxzBMcMOBECz5Svp+hGNBxLgDjijVz7s7X9dIQY1xqCjCGqM6BqVKtibhDCrvdvVT8R56oL1MNeoj5Ba5YG2Rx4pWx3hsFqK546FEm8NI1USRponuST8nktFIcZTsQ2j3mUrTBSzcxXskzZhtuFM4LonF0k1rPSpmykjaMip5HTT+/LHK3UUkBMecGMWYqZxK8cNEh2kZPKA8qNeuki5uz40oS05lK3XGS4UK0v3tVh03mvMiJ/KW40TlNa3fzKHBD+oGkVpGVWKjwtR0v0wEglJFQTF1JyK3kbBXurqbIc96aM7ZPXm2TToxHrXJf9KnwFpa9edcGGFf7M733VDUyNgyRyVMGGFEOT77WAM7QC2FaA5OLSYllCbOBHi8kKn+hY+4f/QvfeHd7N3t218D/+zoKP+iHmb4TFkwwOZbz0CW7WpIZfmClfj+9fSqJpw3fUkjvyTNA+kG8S4Bxuev/kgW3aMhSbnvsQh1jZbIzAeYCPzTE0XYx68Bp2gCm+t4YN2JX7m3oKBVG/AKoYuvgeURWYeArwdbwVJxYcMSAoaMhwTzI4pT8ydD+M2uirshMAaI866eKXOil1mCmyyh/Yqqy/XCk9lwvrAKwBHnxUDdFOnCBqkmBqwJOSulxp9R2gX0Au4cRmc30FTUUADsEzNeDX7zEm5BK718GvcTw2SIrhmjXuTe6DmfKFxAkcpinP7Ft5HSx9Z16uvNNvN07vkmF45v4fBozSrQ== + + + + ArangoDB PHP client: view handler + + + + + + + + \ArangoDBClient\Handler + ViewHandler + \ArangoDBClient\ViewHandler + + A handler that manages views. + + + + + + + OPTION_RENAME + \ArangoDBClient\ViewHandler::OPTION_RENAME + 'rename' + + rename option + + + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object + + + \ArangoDBClient\Connection - - mixed + + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + + + string - - mixed + + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + + string - - array + + + + create + \ArangoDBClient\ViewHandler::create() + + Create a view + This will create a view using the given view object and return an array of the created view object's attributes.<br><br> + + \ArangoDBClient\Exception - - integer + + \ArangoDBClient\View + + + array - + - $collectionId + $view - mixed + \ArangoDBClient\View + + + get + \ArangoDBClient\ViewHandler::get() + + Get a view + This will get a view.<br><br> + + String + + + \ArangoDBClient\View + false + + + \ArangoDBClient\ClientException + + + - $document + $view - mixed - - - $options - array() - array + String - - removeByKeys - \ArangoDBClient\CollectionHandler::removeByKeys() - - Remove document(s) by specifying an array of keys - This will throw on any error - + + properties + \ArangoDBClient\ViewHandler::properties() + + Get a view's properties<br><br> + + \ArangoDBClient\Exception - + mixed - - array - - - array - - + array - + - $collectionId + $view mixed - - $keys - - array - - - $options - array() - array - - - lookupByKeys - \ArangoDBClient\CollectionHandler::lookupByKeys() - - Bulk lookup documents by specifying an array of keys - This will throw on any error - + + setProperties + \ArangoDBClient\ViewHandler::setProperties() + + Set a view's properties<br><br> + + \ArangoDBClient\Exception - + mixed - - array - - + array - + array - + - $collectionId + $view mixed - $keys + $properties array - - $options - array() - array - - - range - \ArangoDBClient\CollectionHandler::range() - - Get document(s) by specifying range - This will throw if the list cannot be fetched from the server - + + drop + \ArangoDBClient\ViewHandler::drop() + + Drop a view<br><br> + + \ArangoDBClient\Exception - - mixed - - - string - - + mixed - - mixed - - - array - - - \ArangoDBClient\Cursor - - - - $collectionId - - mixed - - - $attribute - - string - - - $left - - mixed - - - $right - - mixed - - - $options - array() - array - - - - near - \ArangoDBClient\CollectionHandler::near() - - Get document(s) by specifying near - This will throw if the list cannot be fetched from the server - - \ArangoDBClient\Exception - - - mixed - - - double - - - double - - - array - - - \ArangoDBClient\Cursor + + boolean + - $collectionId + $view mixed - - $latitude - - double - - - $longitude - - double - - - $options - array() - array - - - within - \ArangoDBClient\CollectionHandler::within() - - Get document(s) by specifying within - This will throw if the list cannot be fetched from the server - + + rename + \ArangoDBClient\ViewHandler::rename() + + Rename a view + + \ArangoDBClient\Exception - + mixed - - double - - - double - - - integer - - - array + + string - - \ArangoDBClient\Cursor + + boolean - $collectionId + $view mixed - $latitude - - double - - - $longitude - - double - - - $radius - - integer - - - $options - array() - array - - - - createCollectionIfOptions - \ArangoDBClient\CollectionHandler::createCollectionIfOptions() - - - - - - - - $collection - - - - - $options + $name - + string @@ -13614,23 +14057,23 @@ This is a convenience function that calls json_encode_wrapper on the connection< \ArangoDBClient\Handler - + includeOptionsInBody \ArangoDBClient\Handler::includeOptionsInBody() - + Helper function that runs through the options given and includes them into the parameters array given. Only options that are set in $includeArray will be included. This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - + array - + array - + array - + array @@ -13651,19 +14094,19 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\Handler - + makeCollection \ArangoDBClient\Handler::makeCollection() - + Turn a value into a collection name - + \ArangoDBClient\ClientException - + mixed - + string @@ -13674,6 +14117,31 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\Handler + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + + array + + + mixed + + + + $headers + + array + + + $collection + + mixed + + \ArangoDBClient\Handler + setDocumentClass \ArangoDBClient\DocumentClassable::setDocumentClass() @@ -13715,1385 +14183,1433 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\DocumentClassable - - No summary for method createCollectionIfOptions() - - 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 - + - ArangoDB PHP client: single document + ArangoDB PHP client: result set cursor - - - + - - \ArangoDBClient\Document - Graph - \ArangoDBClient\Graph - - Value object representing a graph - <br> - - - + + + \Iterator + Cursor + \ArangoDBClient\Cursor + + Provides access to the results of an AQL query or another statement + The cursor might not contain all results in the beginning.<br> + +If the result set is too big to be transferred in one go, the +cursor might issue additional HTTP requests to fetch the +remaining results from the server. + + - - ENTRY_EDGE_DEFINITIONS - \ArangoDBClient\Graph::ENTRY_EDGE_DEFINITIONS - 'edgeDefinitions' - - Graph edge definitions + + ENTRY_ID + \ArangoDBClient\Cursor::ENTRY_ID + 'id' + + result entry for cursor id - - ENTRY_FROM - \ArangoDBClient\Graph::ENTRY_FROM - 'from' - - Graph edge definitions from collections + + ENTRY_HASMORE + \ArangoDBClient\Cursor::ENTRY_HASMORE + 'hasMore' + + result entry for "hasMore" flag - - ENTRY_TO - \ArangoDBClient\Graph::ENTRY_TO - 'to' - - Graph edge definitions to collections + + ENTRY_RESULT + \ArangoDBClient\Cursor::ENTRY_RESULT + 'result' + + result entry for result documents - - ENTRY_COLLECTION - \ArangoDBClient\Graph::ENTRY_COLLECTION - 'collection' - - Graph edge definitions collections + + ENTRY_EXTRA + \ArangoDBClient\Cursor::ENTRY_EXTRA + 'extra' + + result entry for extra data - - ENTRY_ORPHAN_COLLECTIONS - \ArangoDBClient\Graph::ENTRY_ORPHAN_COLLECTIONS - 'orphanCollections' - - Graph orphan collections + + ENTRY_STATS + \ArangoDBClient\Cursor::ENTRY_STATS + 'stats' + + result entry for stats - - ENTRY_ID - \ArangoDBClient\Document::ENTRY_ID - '_id' - - Document id index + + FULL_COUNT + \ArangoDBClient\Cursor::FULL_COUNT + 'fullCount' + + result entry for the full count (ignoring the outermost LIMIT) - - ENTRY_KEY - \ArangoDBClient\Document::ENTRY_KEY - '_key' - - Document key index - - - - - ENTRY_REV - \ArangoDBClient\Document::ENTRY_REV - '_rev' - - Revision id index - - - - - ENTRY_ISNEW - \ArangoDBClient\Document::ENTRY_ISNEW - '_isNew' - - isNew id index + + ENTRY_CACHE + \ArangoDBClient\Cursor::ENTRY_CACHE + 'cache' + + cache option entry - - ENTRY_HIDDENATTRIBUTES - \ArangoDBClient\Document::ENTRY_HIDDENATTRIBUTES - '_hiddenAttributes' - - hidden attribute index + + ENTRY_CACHED + \ArangoDBClient\Cursor::ENTRY_CACHED + 'cached' + + cached result attribute - whether or not the result was served from the AQL query cache - - ENTRY_IGNOREHIDDENATTRIBUTES - \ArangoDBClient\Document::ENTRY_IGNOREHIDDENATTRIBUTES - '_ignoreHiddenAttributes' - - hidden attribute index + + ENTRY_SANITIZE + \ArangoDBClient\Cursor::ENTRY_SANITIZE + '_sanitize' + + sanitize option entry - - OPTION_WAIT_FOR_SYNC - \ArangoDBClient\Document::OPTION_WAIT_FOR_SYNC - 'waitForSync' - - waitForSync option index + + ENTRY_FLAT + \ArangoDBClient\Cursor::ENTRY_FLAT + '_flat' + + "flat" option entry (will treat the results as a simple array, not documents) - - OPTION_POLICY - \ArangoDBClient\Document::OPTION_POLICY - 'policy' - - policy option index + + ENTRY_TYPE + \ArangoDBClient\Cursor::ENTRY_TYPE + 'objectType' + + "objectType" option entry. - - OPTION_KEEPNULL - \ArangoDBClient\Document::OPTION_KEEPNULL - 'keepNull' - - keepNull option index + + ENTRY_BASEURL + \ArangoDBClient\Cursor::ENTRY_BASEURL + 'baseurl' + + "baseurl" option entry. - - $_edgeDefinitions - \ArangoDBClient\Graph::_edgeDefinitions - array() - - The list of edge definitions defining the graph. + + $_connection + \ArangoDBClient\Cursor::_connection + + + The connection object - - array<mixed,\ArangoDBClient\EdgeDefinition> + + \ArangoDBClient\Connection - - $_orphanCollections - \ArangoDBClient\Graph::_orphanCollections - array() - - The list of orphan collections defining the graph. - These collections are not used in any edge definition of the graph. - + + $_options + \ArangoDBClient\Cursor::_options + + + Cursor options + + array - - $_id - \ArangoDBClient\Document::_id + + $data + \ArangoDBClient\Cursor::data - - The document id (might be NULL for new documents) + + Result Data - - string + + array - - $_key - \ArangoDBClient\Document::_key + + $_result + \ArangoDBClient\Cursor::_result - - The document key (might be NULL for new documents) + + The result set - - string + + array - - $_rev - \ArangoDBClient\Document::_rev + + $_hasMore + \ArangoDBClient\Cursor::_hasMore - - The document revision (might be NULL for new documents) + + "has more" indicator - if true, the server has more results - - mixed + + boolean - - $_values - \ArangoDBClient\Document::_values - array() - - The document attributes (names/values) + + $_id + \ArangoDBClient\Cursor::_id + + + cursor id - might be NULL if cursor does not have an id - - array + + mixed - - $_changed - \ArangoDBClient\Document::_changed - false - - Flag to indicate whether document was changed locally + + $_position + \ArangoDBClient\Cursor::_position + + + current position in result set iteration (zero-based) - - boolean + + integer - - $_isNew - \ArangoDBClient\Document::_isNew - true - - Flag to indicate whether document is a new document (never been saved to the server) + + $_length + \ArangoDBClient\Cursor::_length + + + total length of result set (in number of documents) - - boolean + + integer - - $_doValidate - \ArangoDBClient\Document::_doValidate - false - - Flag to indicate whether validation of document values should be performed -This can be turned on, but has a performance penalty + + $_fullCount + \ArangoDBClient\Cursor::_fullCount + + + full count of the result set (ignoring the outermost LIMIT) - - boolean + + integer - - $_hiddenAttributes - \ArangoDBClient\Document::_hiddenAttributes - array() - - An array, that defines which attributes should be treated as hidden. + + $_extra + \ArangoDBClient\Cursor::_extra + + + extra data (statistics) returned from the statement - + array - - $_ignoreHiddenAttributes - \ArangoDBClient\Document::_ignoreHiddenAttributes - false - - Flag to indicate whether hidden attributes should be ignored or included in returned data-sets + + $_fetches + \ArangoDBClient\Cursor::_fetches + 1 + + number of HTTP calls that were made to build the cursor result - - boolean - - + + $_cached + \ArangoDBClient\Cursor::_cached + + + whether or not the query result was served from the AQL query result cache + + + + + $_count + \ArangoDBClient\Cursor::_count + + + precalculated number of documents in the cursor, as returned by the server + + + integer + + + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + + + string + + + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + + string + + + + __construct - \ArangoDBClient\Graph::__construct() - - Constructs an empty graph + \ArangoDBClient\Cursor::__construct() + + Initialise the cursor with the first results and some metadata - + + \ArangoDBClient\Connection + + array - + array - - + \ArangoDBClient\ClientException - - $name - null + $connection + + \ArangoDBClient\Connection + + + $data + array $options - array() + array - - addEdgeDefinition - \ArangoDBClient\Graph::addEdgeDefinition() - - Adds an edge definition to the graph. - - - \ArangoDBClient\EdgeDefinition + + delete + \ArangoDBClient\Cursor::delete() + + Explicitly delete the cursor + This might issue an HTTP DELETE request to inform the server about +the deletion. + + \ArangoDBClient\Exception - - \ArangoDBClient\Graph + + boolean - - - $edgeDefinition - - \ArangoDBClient\EdgeDefinition - - - getEdgeDefinitions - \ArangoDBClient\Graph::getEdgeDefinitions() - - Get the edge definitions of the graph. - - - array<mixed,\ArangoDBClient\EdgeDefinition> + + getCount + \ArangoDBClient\Cursor::getCount() + + Get the total number of results in the cursor + This might issue additional HTTP requests to fetch any outstanding +results from the server + + \ArangoDBClient\Exception + + + integer - - - addOrphanCollection - \ArangoDBClient\Graph::addOrphanCollection() - - Adds an orphan collection to the graph. + + getFullCount + \ArangoDBClient\Cursor::getFullCount() + + Get the full count of the cursor (ignoring the outermost LIMIT) - - string - - - \ArangoDBClient\Graph + + integer - - - $orphanCollection - - string - - - getOrphanCollections - \ArangoDBClient\Graph::getOrphanCollections() - - Get the orphan collections of the graph. + + getCached + \ArangoDBClient\Cursor::getCached() + + Get the cached attribute for the result set - - array<mixed,string> + + boolean - - - set - \ArangoDBClient\Graph::set() - - Set a graph attribute - The key (attribute name) must be a string. -This will validate the value of the attribute and might throw an -exception if the value is invalid. - - \ArangoDBClient\ClientException - - - string - - - mixed + + getAll + \ArangoDBClient\Cursor::getAll() + + Get all results as an array + This might issue additional HTTP requests to fetch any outstanding +results from the server + + \ArangoDBClient\Exception - - void + + array - - - $key - - string - - - $value - - mixed - - - getSingleUndirectedRelation - \ArangoDBClient\Graph::getSingleUndirectedRelation() - - returns (or creates) the edge definition for single-vertexcollection-undirected graphs, throw an exception for any other type of graph. + + rewind + \ArangoDBClient\Cursor::rewind() + + Rewind the cursor, necessary for Iterator - - \ArangoDBClient\ClientException - - - \ArangoDBClient\EdgeDefinition + + void - - __construct - \ArangoDBClient\Document::__construct() - - Constructs an empty document + + current + \ArangoDBClient\Cursor::current() + + Return the current result row, necessary for Iterator - + array - - $options - null - array - - \ArangoDBClient\Document - - createFromArray - \ArangoDBClient\Document::createFromArray() - - Factory method to construct a new document using the values passed to populate it + + key + \ArangoDBClient\Cursor::key() + + Return the index of the current result row, necessary for Iterator - - \ArangoDBClient\ClientException - - - array - - - array - - - \ArangoDBClient\Document - \ArangoDBClient\Edge - \ArangoDBClient\Graph + + integer - - $values - - array - - - $options - array() - array - - \ArangoDBClient\Document - - __clone - \ArangoDBClient\Document::__clone() - - Clone a document - Returns the clone - - + + next + \ArangoDBClient\Cursor::next() + + Advance the cursor, necessary for Iterator + + void - \ArangoDBClient\Document - - __toString - \ArangoDBClient\Document::__toString() - - Get a string representation of the document. - It will not output hidden attributes. - -Returns the document as JSON-encoded string - - - string + + valid + \ArangoDBClient\Cursor::valid() + + Check if cursor can be advanced further, necessary for Iterator + This might issue additional HTTP requests to fetch any outstanding +results from the server + + \ArangoDBClient\Exception + + + boolean - \ArangoDBClient\Document - - toJson - \ArangoDBClient\Document::toJson() - - Returns the document as JSON-encoded string + + add + \ArangoDBClient\Cursor::add() + + Create an array of results from the input array - + array - - string + + void + + + \ArangoDBClient\ClientException - $options - array() + $data + array - \ArangoDBClient\Document - - toSerialized - \ArangoDBClient\Document::toSerialized() - - Returns the document as a serialized string + + addFlatFromArray + \ArangoDBClient\Cursor::addFlatFromArray() + + Create an array of results from the input array - + array - - string + + void - $options - array() + $data + array - \ArangoDBClient\Document - - filterHiddenAttributes - \ArangoDBClient\Document::filterHiddenAttributes() - - Returns the attributes with the hidden ones removed + + addDocumentsFromArray + \ArangoDBClient\Cursor::addDocumentsFromArray() + + Create an array of documents from the input array - + array - - array + + void - - array + + \ArangoDBClient\ClientException - $attributes + $data array - - $_hiddenAttributes - array() - array - - \ArangoDBClient\Document - - set - \ArangoDBClient\Document::set() - - Set a document attribute - The key (attribute name) must be a string. -This will validate the value of the attribute and might throw an -exception if the value is invalid. - - \ArangoDBClient\ClientException - - - string - - - mixed + + addPathsFromArray + \ArangoDBClient\Cursor::addPathsFromArray() + + Create an array of paths from the input array + + + array - + void + + \ArangoDBClient\ClientException + - $key - - string - - - $value + $data - mixed + array - \ArangoDBClient\Document - - __set - \ArangoDBClient\Document::__set() - - Set a document attribute, magic method - This is a magic method that allows the object to be used without -declaring all document attributes first. -This function is mapped to set() internally. - - \ArangoDBClient\ClientException - - - - string - - - mixed + + addShortestPathFromArray + \ArangoDBClient\Cursor::addShortestPathFromArray() + + Create an array of shortest paths from the input array + + + array - + void + + \ArangoDBClient\ClientException + - $key + $data - string + array + + + addDistanceToFromArray + \ArangoDBClient\Cursor::addDistanceToFromArray() + + Create an array of distances from the input array + + + array + + + void + + - $value + $data - mixed + array - \ArangoDBClient\Document - - get - \ArangoDBClient\Document::get() - - Get a document attribute + + addCommonNeighborsFromArray + \ArangoDBClient\Cursor::addCommonNeighborsFromArray() + + Create an array of common neighbors from the input array - - string + + array - - mixed + + void + + + \ArangoDBClient\ClientException - $key + $data - string + array - \ArangoDBClient\Document - - __get - \ArangoDBClient\Document::__get() - - Get a document attribute, magic method - This function is mapped to get() internally. - - - string + + addCommonPropertiesFromArray + \ArangoDBClient\Cursor::addCommonPropertiesFromArray() + + Create an array of common properties from the input array + + + array - - mixed + + void - $key + $data - string + array - \ArangoDBClient\Document - - __isset - \ArangoDBClient\Document::__isset() - - Is triggered by calling isset() or empty() on inaccessible properties. + + addFigureFromArray + \ArangoDBClient\Cursor::addFigureFromArray() + + Create an array of figuresfrom the input array - - string + + array - - boolean + + void - $key + $data - string + array - \ArangoDBClient\Document - - __unset - \ArangoDBClient\Document::__unset() - - Magic method to unset an attribute. - Caution!!! This works only on the first array level. -The preferred method to unset attributes in the database, is to set those to null and do an update() with the option: 'keepNull' => false. - - - - - $key - - - - \ArangoDBClient\Document - - - getAll - \ArangoDBClient\Document::getAll() - - Get all document attributes + + addEdgesFromArray + \ArangoDBClient\Cursor::addEdgesFromArray() + + Create an array of Edges from the input array - - mixed - - + array + + void + + + \ArangoDBClient\ClientException + - $options - array() - mixed + $data + + array - \ArangoDBClient\Document - - getAllForInsertUpdate - \ArangoDBClient\Document::getAllForInsertUpdate() - - Get all document attributes for insertion/update + + addVerticesFromArray + \ArangoDBClient\Cursor::addVerticesFromArray() + + Create an array of Vertex from the input array - - mixed + + array - - \ArangoDBClient\Document - - - getAllAsObject - \ArangoDBClient\Document::getAllAsObject() - - Get all document attributes, and return an empty object if the documentapped into a DocumentWrapper class - - - mixed + + void - - mixed + + \ArangoDBClient\ClientException - $options - array() - mixed + $data + + array - \ArangoDBClient\Document - - setHiddenAttributes - \ArangoDBClient\Document::setHiddenAttributes() - - Set the hidden attributes -$cursor - - + + sanitize + \ArangoDBClient\Cursor::sanitize() + + Sanitize the result set rows + This will remove the _id and _rev attributes from the results if the +"sanitize" option is set + array - - void + + array - $attributes + $rows array - \ArangoDBClient\Document - - getHiddenAttributes - \ArangoDBClient\Document::getHiddenAttributes() - - Get the hidden attributes + + fetchOutstanding + \ArangoDBClient\Cursor::fetchOutstanding() + + Fetch outstanding results from the server - - array + + \ArangoDBClient\Exception + + + void - \ArangoDBClient\Document - - isIgnoreHiddenAttributes - \ArangoDBClient\Document::isIgnoreHiddenAttributes() - - + + updateLength + \ArangoDBClient\Cursor::updateLength() + + Set the length of the (fetched) result set - - boolean + + void - \ArangoDBClient\Document - - setIgnoreHiddenAttributes - \ArangoDBClient\Document::setIgnoreHiddenAttributes() - - + + url + \ArangoDBClient\Cursor::url() + + Return the base URL for the cursor - - boolean + + string - - $ignoreHiddenAttributes - - boolean - - \ArangoDBClient\Document - - setChanged - \ArangoDBClient\Document::setChanged() - - Set the changed flag + + getStatValue + \ArangoDBClient\Cursor::getStatValue() + + Get a statistical figure value from the query result - - boolean + + string - - boolean + + integer - $value + $name - boolean + string - \ArangoDBClient\Document - - getChanged - \ArangoDBClient\Document::getChanged() - - Get the changed flag + + getMetadata + \ArangoDBClient\Cursor::getMetadata() + + Get MetaData of the current cursor - - boolean + + array - \ArangoDBClient\Document - - setIsNew - \ArangoDBClient\Document::setIsNew() - - Set the isNew flag + + getExtra + \ArangoDBClient\Cursor::getExtra() + + Return the extra data of the query (statistics etc.). Contents of the result array +depend on the type of query executed - - boolean - - - void + + array - - $isNew - - boolean - - \ArangoDBClient\Document - - getIsNew - \ArangoDBClient\Document::getIsNew() - - Get the isNew flag + + getWarnings + \ArangoDBClient\Cursor::getWarnings() + + Return the warnings issued during query execution - - boolean + + array - \ArangoDBClient\Document - - setInternalId - \ArangoDBClient\Document::setInternalId() - - Set the internal document id - This will throw if the id of an existing document gets updated to some other id - - \ArangoDBClient\ClientException - - - string - - - void + + getWritesExecuted + \ArangoDBClient\Cursor::getWritesExecuted() + + Return the number of writes executed by the query + + + integer - - $id - - string - - \ArangoDBClient\Document - - setInternalKey - \ArangoDBClient\Document::setInternalKey() - - Set the internal document key - This will throw if the key of an existing document gets updated to some other key - - \ArangoDBClient\ClientException - - - string - - - void + + getWritesIgnored + \ArangoDBClient\Cursor::getWritesIgnored() + + Return the number of ignored write operations from the query + + + integer - - $key - - string - - \ArangoDBClient\Document - - getInternalId - \ArangoDBClient\Document::getInternalId() - - Get the internal document id (if already known) - Document ids are generated on the server only. Document ids consist of collection id and -document id, in the format collectionId/documentId - - string + + getScannedFull + \ArangoDBClient\Cursor::getScannedFull() + + Return the number of documents iterated over in full scans + + + integer - \ArangoDBClient\Document - - getInternalKey - \ArangoDBClient\Document::getInternalKey() - - Get the internal document key (if already known) + + getScannedIndex + \ArangoDBClient\Cursor::getScannedIndex() + + Return the number of documents iterated over in index scans - - string - - - \ArangoDBClient\Document - - - getHandle - \ArangoDBClient\Document::getHandle() - - Convenience function to get the document handle (if already known) - is an alias to getInternalId() - Document handles are generated on the server only. Document handles consist of collection id and -document id, in the format collectionId/documentId - - string + + integer - \ArangoDBClient\Document - - getId - \ArangoDBClient\Document::getId() - - Get the document id (or document handle) if already known. - It is a string and consists of the collection's name and the document key (_key attribute) separated by /. -Example: (collectionname/documentId) - -The document handle is stored in a document's _id attribute. - - mixed + + getFiltered + \ArangoDBClient\Cursor::getFiltered() + + Return the number of documents filtered by the query + + + integer - \ArangoDBClient\Document - - getKey - \ArangoDBClient\Document::getKey() - - Get the document key (if already known). - Alias function for getInternalKey() - - mixed + + getFetches + \ArangoDBClient\Cursor::getFetches() + + Return the number of HTTP calls that were made to build the cursor result + + + integer - \ArangoDBClient\Document - - getCollectionId - \ArangoDBClient\Document::getCollectionId() - - Get the collection id (if already known) - Collection ids are generated on the server only. Collection ids are numeric but might be -bigger than PHP_INT_MAX. To reliably store a collection id elsewhere, a PHP string should be used - - mixed + + getId + \ArangoDBClient\Cursor::getId() + + Return the cursor id, if any + + + string - \ArangoDBClient\Document - - setRevision - \ArangoDBClient\Document::setRevision() - - Set the document revision - Revision ids are generated on the server only. - -Document ids are strings, even if they look "numeric" -To reliably store a document id elsewhere, a PHP string must be used - - mixed + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use + + + string - - void + + \ArangoDBClient\DocumentClassable - $rev + $class - mixed + string - \ArangoDBClient\Document - - - getRevision - \ArangoDBClient\Document::getRevision() - - Get the document revision (if already known) - - - mixed - - - \ArangoDBClient\Document + \ArangoDBClient\DocumentClassable - - jsonSerialize - \ArangoDBClient\Document::jsonSerialize() - - Get all document attributes -Alias function for getAll() - it's necessary for implementing JsonSerializable interface + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use - - mixed + + string - - array + + \ArangoDBClient\DocumentClassable - $options - array() - mixed + $class + + string - \ArangoDBClient\Document + \ArangoDBClient\DocumentClassable - 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 - + - ArangoDB PHP client: single document + ArangoDB PHP client: transaction base - - - + + - + - EdgeDefinition - \ArangoDBClient\EdgeDefinition - - Value object representing an edge Definition. - An edge definition contains a collection called 'relation' to store the edges and -multiple vertices collection defined in 'fromCollections' and 'toCollections'. - -<br> - - + TransactionBase + \ArangoDBClient\TransactionBase + + Transaction base class, used by Transaction and StreamingTransaction + + + - - $_relation - \ArangoDBClient\EdgeDefinition::_relation - - - The name of the edge collection for this relation. + + ENTRY_COLLECTIONS + \ArangoDBClient\TransactionBase::ENTRY_COLLECTIONS + 'collections' + + Collections index - - string - - - - $_fromCollections - \ArangoDBClient\EdgeDefinition::_fromCollections - array() - - An array containing the names of the vertices collections holding the start vertices. + + + ENTRY_WAIT_FOR_SYNC + \ArangoDBClient\TransactionBase::ENTRY_WAIT_FOR_SYNC + 'waitForSync' + + WaitForSync index - - array + + + + ENTRY_LOCK_TIMEOUT + \ArangoDBClient\TransactionBase::ENTRY_LOCK_TIMEOUT + 'lockTimeout' + + Lock timeout index + + + + + ENTRY_READ + \ArangoDBClient\TransactionBase::ENTRY_READ + 'read' + + Read index + + + + + ENTRY_WRITE + \ArangoDBClient\TransactionBase::ENTRY_WRITE + 'write' + + WRITE index + + + + + ENTRY_EXCLUSIVE + \ArangoDBClient\TransactionBase::ENTRY_EXCLUSIVE + 'exclusive' + + EXCLUSIVE index + + + + + $_connection + \ArangoDBClient\TransactionBase::_connection + + + The connection object + + + \ArangoDBClient\Connection - - $_toCollections - \ArangoDBClient\EdgeDefinition::_toCollections + + $attributes + \ArangoDBClient\TransactionBase::attributes array() - - An array containing the names of the vertices collections holding the end vertices. + + The transaction's attributes. - + array - + __construct - \ArangoDBClient\EdgeDefinition::__construct() - - Constructs an new edge definition + \ArangoDBClient\TransactionBase::__construct() + + Initialise the transaction object - - string - - - array - string + + \ArangoDBClient\Connection - - array - string + + \ArangoDBClient\ClientException - - $relation - null - string - - - $fromCollections - array() - array|string - - - $toCollections - array() - array|string + $connection + + \ArangoDBClient\Connection - - setRelation - \ArangoDBClient\EdgeDefinition::setRelation() - - Set the relation of the edge definition + + getConnection + \ArangoDBClient\TransactionBase::getConnection() + + Return the connection object - - string + + \ArangoDBClient\Connection + + + + + setCollections + \ArangoDBClient\TransactionBase::setCollections() + + Set the collections array. + The array should have 2 sub-arrays, namely 'read' and 'write' which should hold the respective collections +for the transaction + + array - - $relation + $value - string + array - - getRelation - \ArangoDBClient\EdgeDefinition::getRelation() - - Get the relation of the edge definition. - - - string + + getCollections + \ArangoDBClient\TransactionBase::getCollections() + + Get collections array + This holds the read and write collections of the transaction + + array - - - getToCollections - \ArangoDBClient\EdgeDefinition::getToCollections() - - Get the 'to' collections of the graph. + + setWaitForSync + \ArangoDBClient\TransactionBase::setWaitForSync() + + set waitForSync value - - array + + boolean + + + \ArangoDBClient\ClientException - + + $value + + boolean + - - getFromCollections - \ArangoDBClient\EdgeDefinition::getFromCollections() - - Get the 'from' collections of the graph. + + getWaitForSync + \ArangoDBClient\TransactionBase::getWaitForSync() + + get waitForSync value - - array + + boolean - - - addToCollection - \ArangoDBClient\EdgeDefinition::addToCollection() - - Add a 'to' collections of the graph. + + setLockTimeout + \ArangoDBClient\TransactionBase::setLockTimeout() + + Set lockTimeout value - - string + + integer + + + \ArangoDBClient\ClientException - - $toCollection + $value - string + integer - - addFromCollection - \ArangoDBClient\EdgeDefinition::addFromCollection() - - Add a 'from' collections of the graph. + + getLockTimeout + \ArangoDBClient\TransactionBase::getLockTimeout() + + Get lockTimeout value - - string + + integer + + + + + setReadCollections + \ArangoDBClient\TransactionBase::setReadCollections() + + Convenience function to directly set read-collections without having to access +them from the collections attribute. + + + array - - $fromCollection + $value - string + array - - clearToCollection - \ArangoDBClient\EdgeDefinition::clearToCollection() - - Resets the 'to' collections of the graph. + + getReadCollections + \ArangoDBClient\TransactionBase::getReadCollections() + + Convenience function to directly get read-collections without having to access +them from the collections attribute. - + + array + - - clearFromCollection - \ArangoDBClient\EdgeDefinition::clearFromCollection() - - Resets the 'from' collections of the graph. + + setWriteCollections + \ArangoDBClient\TransactionBase::setWriteCollections() + + Convenience function to directly set write-collections without having to access +them from the collections attribute. - + + array + + + $value + + array + - - transformToArray - \ArangoDBClient\EdgeDefinition::transformToArray() - - Transforms an edge definition to an array. + + getWriteCollections + \ArangoDBClient\TransactionBase::getWriteCollections() + + Convenience function to directly get write-collections without having to access +them from the collections attribute. - + array - - - createUndirectedRelation - \ArangoDBClient\EdgeDefinition::createUndirectedRelation() - - Constructs an undirected relation. This relation is an edge definition where the edges can start and end -in any vertex from the collection list. + + setExclusiveCollections + \ArangoDBClient\TransactionBase::setExclusiveCollections() + + Convenience function to directly set exclusive-collections without having to access +them from the collections attribute. - - string + + array - + + + $value + + array + + + + getExclusiveCollections + \ArangoDBClient\TransactionBase::getExclusiveCollections() + + Convenience function to directly get exclusive-collections without having to access +them from the collections attribute. + + array - - \ArangoDBClient\EdgeDefinition + + + + set + \ArangoDBClient\TransactionBase::set() + + Sets an attribute + + + + + \ArangoDBClient\ClientException - - $relation + $key - string + - $vertexCollections + $value - array + - - createDirectedRelation - \ArangoDBClient\EdgeDefinition::createDirectedRelation() - - Constructs a directed relation. This relation is an edge definition where the edges can start only in the -vertices defined in 'fromCollections' and end in vertices defined in 'toCollections'. - - - string + + __set + \ArangoDBClient\TransactionBase::__set() + + Set an attribute, magic method + This is a magic method that allows the object to be used without +declaring all document attributes first. + + \ArangoDBClient\ClientException - - array + + string - - array - string + + mixed - - \ArangoDBClient\EdgeDefinition + + void - - $relation + $key string - $fromCollections + $value - array|string + mixed + + + get + \ArangoDBClient\TransactionBase::get() + + Get an attribute + + + string + + + mixed + + - $toCollections + $key - array|string + string - - eJztWE1v4zYQvftXzCGAnMBx2qCn7Ec3m+xmj4tt2ksSGLRE22ppSqCobI1t/3uHFEWRlGRL2aS91AgQm0POzJs3M+Lo9c/5Jp9Mzk5OJnACl4LwdXb9Hj5/+gwxSymXF1CkfM0oJFlcbnEB96mt73IS/0HWFMCeutIHtJCUcpMJlMFHlomUcHhPhKSs0NI4y3ciXW8kXNlv5z/8+NMMJO5dU17AzXb5aYZilq05ncENFVvCd7VtdClWlgHO5+e4cjaZcLKlBfpEA3deWXC/EVZSyJa/01iCoLmgBcoRHKB7NEEo13SV8lSmGZ/raJjlxC5DnHFJUvSP4FfGUJNeJfg1gUhQRtRCBDKDQmaCgtxQrQRP8EQp3ZZMpjnG85EKmcYocBRpS6gp5RCtRLa9sqIiUgogkpm7NjcBeb0Ubwfx0g5czEhRwAd0sUE/+TZRW3Tc1OcEbhGGijBkKwvJdXyFZMtNWkAdgrk5WSt490gEhkSocO9RZLaf6f+5yCQuYzyOFrVepDNwDVkiQpBdzY2yII27RW2mI9gFbDKW1LsLiflpt3V6X1nx1PqnhuAIWIU3cPfwUpgoJsxYRO6ZIXi8fOxBc4UiKcpYqiIATr+GZRX6lhNBtnW2VJ+jOgHMbzj10shKp+pXyRMq2E6dDvLreB4Y0SH4y5g6Ctk5xTpnaSGVGTfKGIHHtImzru8gF7AgSA2hJoXUvdSpHIViv1N+iGGUUx6dT3HJehZ0DldosqJcsjSGVckrLYtFXPM+bdh7A7xkbNYOtUqdWQhWLR5r7VVH0pmg+szp24Wj8ijoDnpb28BUx/W4JXrl6A5i7RzyRK4h40/b3j471Zm2udCM2v13q6J+odJPe7ebDqyrhpNT21vCchqUBd30F1R+MVoa+sdx2Y39Zhj2luuCylJwg/4JgNYOoBCH0R3CsRD6MODjPPJq2GBZC5Jv+hDohHwagFs3uQ6hGJSJFonK9X8Vy0e/uA6h6azFNp7LJMGeOI4Xv6zcsHWUFkkSfHA2ur+jxFCVS+jUM91Xah6rdw9hyzkQl5Es+5HxKXjx2PgJMg3M98UnyJMqQv5iX4y+4ECBd5zxhT0cVswoER7pg3g2F7PDbo/kd6TjASPjKnYvhlscdQocQraFHeacqQ2nMWJ6zXM3Ilkbvs0ulYoOPuodNPmQgP9pILW33kUNDVFVpzou3nOo/7Bm8sHaaQ63+ma/DkziB8fXRkfwHHFuQ5ZDV1Pvc9CfDPDanopqsLAXEJw8nakS0k5+v26oN2rHhJvruJqZqRq8K3s4VxO+0zdi+ieoEOlTzt1XXawPtLFwEnneWQRZqNz7vjnEAO+f/wxRweA/uADQivTqW1Ai6a+Wwfbdb9YBrKcDqBHRd2y/mk7Vg5IOnj3jMs52Ks9QVhu0A9jB1zuKMRR2Hmi9+dmTo6ac/5+Z/9uZ+UVq7HpfhQVkhAP10+rtkFJbafinXycuCEtJMfVVXlxo2Qyi+/ot7715Q7m897dGqPIfNEzqrA== - - - - ArangoDB PHP client: single vertex document - + + __get + \ArangoDBClient\TransactionBase::__get() + + Get an attribute, magic method + This function is mapped to get() internally. + + + string + + + mixed + + + + $key + + string + + + + __isset + \ArangoDBClient\TransactionBase::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. + + + string + + + boolean + + + + $key + + string + + + + buildTransactionAttributesFromArray + \ArangoDBClient\TransactionBase::buildTransactionAttributesFromArray() + + Build the object's attributes from a given array + + + + \ArangoDBClient\ClientException + + + + $options + + + + + + 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 + + + + ArangoDB PHP client: single document + - - + + - + \ArangoDBClient\Document - Vertex - \ArangoDBClient\Vertex - - Value object representing a single vertex document + Graph + \ArangoDBClient\Graph + + Value object representing a graph <br> - - + + + + ENTRY_EDGE_DEFINITIONS + \ArangoDBClient\Graph::ENTRY_EDGE_DEFINITIONS + 'edgeDefinitions' + + Graph edge definitions + + + + + ENTRY_FROM + \ArangoDBClient\Graph::ENTRY_FROM + 'from' + + Graph edge definitions from collections + + + + + ENTRY_TO + \ArangoDBClient\Graph::ENTRY_TO + 'to' + + Graph edge definitions to collections + + + + + ENTRY_COLLECTION + \ArangoDBClient\Graph::ENTRY_COLLECTION + 'collection' + + Graph edge definitions collections + + + + + ENTRY_ORPHAN_COLLECTIONS + \ArangoDBClient\Graph::ENTRY_ORPHAN_COLLECTIONS + 'orphanCollections' + + Graph orphan collections + + + ENTRY_ID \ArangoDBClient\Document::ENTRY_ID @@ -15175,6 +15691,39 @@ vertices defined in 'fromCollections' and end in vertices defined in 'toCollecti + + KEY_REGEX_PART + \ArangoDBClient\Document::KEY_REGEX_PART + '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' + + regular expression used for key validation + + + + + $_edgeDefinitions + \ArangoDBClient\Graph::_edgeDefinitions + array() + + The list of edge definitions defining the graph. + + + array<mixed,\ArangoDBClient\EdgeDefinition> + + + + + $_orphanCollections + \ArangoDBClient\Graph::_orphanCollections + array() + + The list of orphan collections defining the graph. + These collections are not used in any edge definition of the graph. + + array + + + $_id \ArangoDBClient\Document::_id @@ -15284,47 +15833,27 @@ This can be turned on, but has a performance penalty - + __construct - \ArangoDBClient\Document::__construct() - - Constructs an empty document - - - array - - - - $options - null - array - - \ArangoDBClient\Document - - - createFromArray - \ArangoDBClient\Document::createFromArray() - - Factory method to construct a new document using the values passed to populate it + \ArangoDBClient\Graph::__construct() + + Constructs an empty graph - - \ArangoDBClient\ClientException - - + array - + array - - \ArangoDBClient\Document - \ArangoDBClient\Edge - \ArangoDBClient\Graph + + + \ArangoDBClient\ClientException + - $values - + $name + null array @@ -15332,89 +15861,249 @@ This can be turned on, but has a performance penalty array() array - \ArangoDBClient\Document - - - __clone - \ArangoDBClient\Document::__clone() - - Clone a document - Returns the clone - - - void - - - \ArangoDBClient\Document - - - __toString - \ArangoDBClient\Document::__toString() - - Get a string representation of the document. - It will not output hidden attributes. - -Returns the document as JSON-encoded string - - - string - - - \ArangoDBClient\Document - - toJson - \ArangoDBClient\Document::toJson() - - Returns the document as JSON-encoded string + + addEdgeDefinition + \ArangoDBClient\Graph::addEdgeDefinition() + + Adds an edge definition to the graph. - - array + + \ArangoDBClient\EdgeDefinition - - string + + \ArangoDBClient\Graph + - $options - array() - array + $edgeDefinition + + \ArangoDBClient\EdgeDefinition - \ArangoDBClient\Document - - toSerialized - \ArangoDBClient\Document::toSerialized() - - Returns the document as a serialized string + + getEdgeDefinitions + \ArangoDBClient\Graph::getEdgeDefinitions() + + Get the edge definitions of the graph. - - array + + array<mixed,\ArangoDBClient\EdgeDefinition> - + + + + + addOrphanCollection + \ArangoDBClient\Graph::addOrphanCollection() + + Adds an orphan collection to the graph. + + string + + \ArangoDBClient\Graph + + - $options - array() + $orphanCollection + + string + + + + getOrphanCollections + \ArangoDBClient\Graph::getOrphanCollections() + + Get the orphan collections of the graph. + + + array<mixed,string> + + + + + + set + \ArangoDBClient\Graph::set() + + Set a graph attribute + The key (attribute name) must be a string. +This will validate the value of the attribute and might throw an +exception if the value is invalid. + + \ArangoDBClient\ClientException + + + string + + + mixed + + + void + + + + + $key + + string + + + $value + + mixed + + + + getSingleUndirectedRelation + \ArangoDBClient\Graph::getSingleUndirectedRelation() + + returns (or creates) the edge definition for single-vertexcollection-undirected graphs, throw an exception for any other type of graph. + + + \ArangoDBClient\ClientException + + + \ArangoDBClient\EdgeDefinition + + + + + __construct + \ArangoDBClient\Document::__construct() + + Constructs an empty document + + + array + + + + $options + null array \ArangoDBClient\Document - + + createFromArray + \ArangoDBClient\Document::createFromArray() + + Factory method to construct a new document using the values passed to populate it + + + \ArangoDBClient\ClientException + + + array + + + array + + + \ArangoDBClient\Document + \ArangoDBClient\Edge + \ArangoDBClient\Graph + + + + $values + + array + + + $options + array() + array + + \ArangoDBClient\Document + + + __clone + \ArangoDBClient\Document::__clone() + + Clone a document + Returns the clone + + + void + + + \ArangoDBClient\Document + + + __toString + \ArangoDBClient\Document::__toString() + + Get a string representation of the document. + It will not output hidden attributes. + +Returns the document as JSON-encoded string + + + string + + + \ArangoDBClient\Document + + + toJson + \ArangoDBClient\Document::toJson() + + Returns the document as JSON-encoded string + + + array + + + string + + + + $options + array() + array + + \ArangoDBClient\Document + + + toSerialized + \ArangoDBClient\Document::toSerialized() + + Returns the document as a serialized string + + + array + + + string + + + + $options + array() + array + + \ArangoDBClient\Document + + filterHiddenAttributes \ArangoDBClient\Document::filterHiddenAttributes() - + Returns the attributes with the hidden ones removed - + array - + array - + array @@ -15430,24 +16119,24 @@ Returns the document as JSON-encoded string \ArangoDBClient\Document - + set \ArangoDBClient\Document::set() - + Set a document attribute The key (attribute name) must be a string. This will validate the value of the attribute and might throw an exception if the value is invalid. - + \ArangoDBClient\ClientException - + string - + mixed - + void @@ -15463,25 +16152,25 @@ exception if the value is invalid. \ArangoDBClient\Document - + __set \ArangoDBClient\Document::__set() - + Set a document attribute, magic method This is a magic method that allows the object to be used without declaring all document attributes first. This function is mapped to set() internally. - + \ArangoDBClient\ClientException - - + + string - + mixed - + void @@ -15497,16 +16186,16 @@ This function is mapped to set() internally. \ArangoDBClient\Document - + get \ArangoDBClient\Document::get() - + Get a document attribute - + string - + mixed @@ -15517,17 +16206,17 @@ This function is mapped to set() internally. \ArangoDBClient\Document - + __get \ArangoDBClient\Document::__get() - + Get a document attribute, magic method This function is mapped to get() internally. - - + + string - + mixed @@ -15538,16 +16227,16 @@ This function is mapped to set() internally. \ArangoDBClient\Document - + __isset \ArangoDBClient\Document::__isset() - + Is triggered by calling isset() or empty() on inaccessible properties. - + string - + boolean @@ -15558,15 +16247,15 @@ This function is mapped to set() internally. \ArangoDBClient\Document - + __unset \ArangoDBClient\Document::__unset() - + Magic method to unset an attribute. Caution!!! This works only on the first array level. The preferred method to unset attributes in the database, is to set those to null and do an update() with the option: 'keepNull' => false. - - + + $key @@ -15575,16 +16264,16 @@ The preferred method to unset attributes in the database, is to set those to nul \ArangoDBClient\Document - + getAll \ArangoDBClient\Document::getAll() - + Get all document attributes - + mixed - + array @@ -15595,28 +16284,28 @@ The preferred method to unset attributes in the database, is to set those to nul \ArangoDBClient\Document - + getAllForInsertUpdate \ArangoDBClient\Document::getAllForInsertUpdate() - + Get all document attributes for insertion/update - + mixed \ArangoDBClient\Document - + getAllAsObject \ArangoDBClient\Document::getAllAsObject() - + Get all document attributes, and return an empty object if the documentapped into a DocumentWrapper class - + mixed - + mixed @@ -15627,17 +16316,17 @@ The preferred method to unset attributes in the database, is to set those to nul \ArangoDBClient\Document - + setHiddenAttributes \ArangoDBClient\Document::setHiddenAttributes() - + Set the hidden attributes $cursor - + array - + void @@ -15648,37 +16337,37 @@ $cursor \ArangoDBClient\Document - + getHiddenAttributes \ArangoDBClient\Document::getHiddenAttributes() - + Get the hidden attributes - + array \ArangoDBClient\Document - + isIgnoreHiddenAttributes \ArangoDBClient\Document::isIgnoreHiddenAttributes() - + - + boolean \ArangoDBClient\Document - + setIgnoreHiddenAttributes \ArangoDBClient\Document::setIgnoreHiddenAttributes() - + - + boolean @@ -15689,16 +16378,16 @@ $cursor \ArangoDBClient\Document - + setChanged \ArangoDBClient\Document::setChanged() - + Set the changed flag - + boolean - + boolean @@ -15709,28 +16398,28 @@ $cursor \ArangoDBClient\Document - + getChanged \ArangoDBClient\Document::getChanged() - + Get the changed flag - + boolean \ArangoDBClient\Document - + setIsNew \ArangoDBClient\Document::setIsNew() - + Set the isNew flag - + boolean - + void @@ -15741,31 +16430,31 @@ $cursor \ArangoDBClient\Document - + getIsNew \ArangoDBClient\Document::getIsNew() - + Get the isNew flag - + boolean \ArangoDBClient\Document - + setInternalId \ArangoDBClient\Document::setInternalId() - + Set the internal document id This will throw if the id of an existing document gets updated to some other id - + \ArangoDBClient\ClientException - + string - + void @@ -15776,19 +16465,19 @@ $cursor \ArangoDBClient\Document - + setInternalKey \ArangoDBClient\Document::setInternalKey() - + Set the internal document key This will throw if the key of an existing document gets updated to some other key - + \ArangoDBClient\ClientException - + string - + void @@ -15799,97 +16488,97 @@ $cursor \ArangoDBClient\Document - + getInternalId \ArangoDBClient\Document::getInternalId() - + Get the internal document id (if already known) Document ids are generated on the server only. Document ids consist of collection id and document id, in the format collectionId/documentId - + string \ArangoDBClient\Document - + getInternalKey \ArangoDBClient\Document::getInternalKey() - + Get the internal document key (if already known) - + string \ArangoDBClient\Document - + getHandle \ArangoDBClient\Document::getHandle() - + Convenience function to get the document handle (if already known) - is an alias to getInternalId() Document handles are generated on the server only. Document handles consist of collection id and document id, in the format collectionId/documentId - + string \ArangoDBClient\Document - + getId \ArangoDBClient\Document::getId() - + Get the document id (or document handle) if already known. It is a string and consists of the collection's name and the document key (_key attribute) separated by /. Example: (collectionname/documentId) The document handle is stored in a document's _id attribute. - + mixed \ArangoDBClient\Document - + getKey \ArangoDBClient\Document::getKey() - + Get the document key (if already known). Alias function for getInternalKey() - + mixed \ArangoDBClient\Document - + getCollectionId \ArangoDBClient\Document::getCollectionId() - + Get the collection id (if already known) Collection ids are generated on the server only. Collection ids are numeric but might be bigger than PHP_INT_MAX. To reliably store a collection id elsewhere, a PHP string should be used - + mixed \ArangoDBClient\Document - + setRevision \ArangoDBClient\Document::setRevision() - + Set the document revision Revision ids are generated on the server only. Document ids are strings, even if they look "numeric" To reliably store a document id elsewhere, a PHP string must be used - + mixed - + void @@ -15900,29 +16589,29 @@ To reliably store a document id elsewhere, a PHP string must be used \ArangoDBClient\Document - + getRevision \ArangoDBClient\Document::getRevision() - + Get the document revision (if already known) - + mixed \ArangoDBClient\Document - + jsonSerialize \ArangoDBClient\Document::jsonSerialize() - + Get all document attributes Alias function for getAll() - it's necessary for implementing JsonSerializable interface - + mixed - + array @@ -15934,404 +16623,262 @@ Alias function for getAll() - it's necessary for implementing JsonSerializable i \ArangoDBClient\Document - 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 - + - ArangoDB PHP client: single collection + ArangoDB PHP client: single document + - + - Collection - \ArangoDBClient\Collection - - Value object representing a collection + \JsonSerializable + Document + \ArangoDBClient\Document + + Value object representing a single collection-based document <br> - - + + - + ENTRY_ID - \ArangoDBClient\Collection::ENTRY_ID - 'id' - - Collection id index + \ArangoDBClient\Document::ENTRY_ID + '_id' + + Document id index - - ENTRY_NAME - \ArangoDBClient\Collection::ENTRY_NAME - 'name' - - Collection name index + + ENTRY_KEY + \ArangoDBClient\Document::ENTRY_KEY + '_key' + + Document key index - - ENTRY_TYPE - \ArangoDBClient\Collection::ENTRY_TYPE - 'type' - - Collection type index + + ENTRY_REV + \ArangoDBClient\Document::ENTRY_REV + '_rev' + + Revision id index - - ENTRY_WAIT_SYNC - \ArangoDBClient\Collection::ENTRY_WAIT_SYNC - 'waitForSync' - - Collection 'waitForSync' index + + ENTRY_ISNEW + \ArangoDBClient\Document::ENTRY_ISNEW + '_isNew' + + isNew id index - - ENTRY_JOURNAL_SIZE - \ArangoDBClient\Collection::ENTRY_JOURNAL_SIZE - 'journalSize' - - Collection 'journalSize' index - - - - - ENTRY_STATUS - \ArangoDBClient\Collection::ENTRY_STATUS - 'status' - - Collection 'status' index - - - - - ENTRY_KEY_OPTIONS - \ArangoDBClient\Collection::ENTRY_KEY_OPTIONS - 'keyOptions' - - Collection 'keyOptions' index - - - - - ENTRY_IS_SYSTEM - \ArangoDBClient\Collection::ENTRY_IS_SYSTEM - 'isSystem' - - Collection 'isSystem' index - - - - - ENTRY_IS_VOLATILE - \ArangoDBClient\Collection::ENTRY_IS_VOLATILE - 'isVolatile' - - Collection 'isVolatile' index - - - - - ENTRY_NUMBER_OF_SHARDS - \ArangoDBClient\Collection::ENTRY_NUMBER_OF_SHARDS - 'numberOfShards' - - Collection 'numberOfShards' index - - - - - ENTRY_REPLICATION_FACTOR - \ArangoDBClient\Collection::ENTRY_REPLICATION_FACTOR - 'replicationFactor' - - Collection 'replicationFactor' index - - - - - ENTRY_SHARDING_STRATEGY - \ArangoDBClient\Collection::ENTRY_SHARDING_STRATEGY - 'shardingStrategy' - - Collection 'shardingStrategy' index - - - - - ENTRY_SHARD_KEYS - \ArangoDBClient\Collection::ENTRY_SHARD_KEYS - 'shardKeys' - - Collection 'shardKeys' index - - - - - OPTION_PROPERTIES - \ArangoDBClient\Collection::OPTION_PROPERTIES - 'properties' - - properties option - - - - - TYPE_DOCUMENT - \ArangoDBClient\Collection::TYPE_DOCUMENT - 2 - - document collection type - - - - - TYPE_EDGE - \ArangoDBClient\Collection::TYPE_EDGE - 3 - - edge collection type + + ENTRY_HIDDENATTRIBUTES + \ArangoDBClient\Document::ENTRY_HIDDENATTRIBUTES + '_hiddenAttributes' + + hidden attribute index - - STATUS_NEW_BORN - \ArangoDBClient\Collection::STATUS_NEW_BORN - 1 - - New born collection + + ENTRY_IGNOREHIDDENATTRIBUTES + \ArangoDBClient\Document::ENTRY_IGNOREHIDDENATTRIBUTES + '_ignoreHiddenAttributes' + + hidden attribute index - - STATUS_UNLOADED - \ArangoDBClient\Collection::STATUS_UNLOADED - 2 - - Unloaded collection + + OPTION_WAIT_FOR_SYNC + \ArangoDBClient\Document::OPTION_WAIT_FOR_SYNC + 'waitForSync' + + waitForSync option index - - STATUS_LOADED - \ArangoDBClient\Collection::STATUS_LOADED - 3 - - Loaded collection + + OPTION_POLICY + \ArangoDBClient\Document::OPTION_POLICY + 'policy' + + policy option index - - STATUS_BEING_UNLOADED - \ArangoDBClient\Collection::STATUS_BEING_UNLOADED - 4 - - Collection being unloaded + + OPTION_KEEPNULL + \ArangoDBClient\Document::OPTION_KEEPNULL + 'keepNull' + + keepNull option index - - STATUS_DELETED - \ArangoDBClient\Collection::STATUS_DELETED - 5 - - Deleted collection + + KEY_REGEX_PART + \ArangoDBClient\Document::KEY_REGEX_PART + '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' + + regular expression used for key validation - + $_id - \ArangoDBClient\Collection::_id + \ArangoDBClient\Document::_id - - The collection id (might be NULL for new collections) + + The document id (might be NULL for new documents) - - mixed + + string - - $_name - \ArangoDBClient\Collection::_name + + $_key + \ArangoDBClient\Document::_key - - The collection name (might be NULL for new collections) + + The document key (might be NULL for new documents) - + string - - $_type - \ArangoDBClient\Collection::_type + + $_rev + \ArangoDBClient\Document::_rev - - The collection type (might be NULL for new collections) + + The document revision (might be NULL for new documents) - - integer + + mixed - - $_waitForSync - \ArangoDBClient\Collection::_waitForSync - - - The collection waitForSync value (might be NULL for new collections) + + $_values + \ArangoDBClient\Document::_values + array() + + The document attributes (names/values) - - boolean + + array - - $_journalSize - \ArangoDBClient\Collection::_journalSize - - - The collection journalSize value (might be NULL for new collections) + + $_changed + \ArangoDBClient\Document::_changed + false + + Flag to indicate whether document was changed locally - - integer + + boolean - - $_isSystem - \ArangoDBClient\Collection::_isSystem - - - The collection isSystem value (might be NULL for new collections) + + $_isNew + \ArangoDBClient\Document::_isNew + true + + Flag to indicate whether document is a new document (never been saved to the server) - + boolean - - $_isVolatile - \ArangoDBClient\Collection::_isVolatile - - - The collection isVolatile value (might be NULL for new collections) + + $_doValidate + \ArangoDBClient\Document::_doValidate + false + + Flag to indicate whether validation of document values should be performed +This can be turned on, but has a performance penalty - + boolean - - $_numberOfShards - \ArangoDBClient\Collection::_numberOfShards - - - The collection numberOfShards value (might be NULL for new collections) + + $_hiddenAttributes + \ArangoDBClient\Document::_hiddenAttributes + array() + + An array, that defines which attributes should be treated as hidden. - - mixed - - - - - $_replicationFactor - \ArangoDBClient\Collection::_replicationFactor - - - The replicationFactor value (might be NULL for new collections) - - - mixed - - - - - $_shardingStrategy - \ArangoDBClient\Collection::_shardingStrategy - - - The shardingStrategy value (might be NULL for new collections) - - - mixed - - - - - $_shardKeys - \ArangoDBClient\Collection::_shardKeys - - - The collection shardKeys value (might be NULL for new collections) - - + array - - $_status - \ArangoDBClient\Collection::_status - - - The collection status value - - - integer - - - - - $_keyOptions - \ArangoDBClient\Collection::_keyOptions - - - The collection keyOptions value + + $_ignoreHiddenAttributes + \ArangoDBClient\Document::_ignoreHiddenAttributes + false + + Flag to indicate whether hidden attributes should be ignored or included in returned data-sets - - array + + boolean - + __construct - \ArangoDBClient\Collection::__construct() - - Constructs an empty collection + \ArangoDBClient\Document::__construct() + + Constructs an empty document - - string - - - \ArangoDBClient\ClientException + + array - $name + $options null - string + array - + createFromArray - \ArangoDBClient\Collection::createFromArray() - - Factory method to construct a new collection + \ArangoDBClient\Document::createFromArray() + + Factory method to construct a new document using the values passed to populate it - + \ArangoDBClient\ClientException - + array - - \ArangoDBClient\Collection + + array + + + \ArangoDBClient\Document + \ArangoDBClient\Edge + \ArangoDBClient\Graph @@ -16339,94 +16886,121 @@ Alias function for getAll() - it's necessary for implementing JsonSerializable i array + + $options + array() + array + - - getDefaultType - \ArangoDBClient\Collection::getDefaultType() - - Get the default collection type - - - string - - - - + __clone - \ArangoDBClient\Collection::__clone() - - Clone a collection + \ArangoDBClient\Document::__clone() + + Clone a document Returns the clone - - + + void - + __toString - \ArangoDBClient\Collection::__toString() - - Get a string representation of the collection - Returns the collection as JSON-encoded string - - + \ArangoDBClient\Document::__toString() + + Get a string representation of the document. + It will not output hidden attributes. + +Returns the document as JSON-encoded string + + string - + toJson - \ArangoDBClient\Collection::toJson() - - Returns the collection as JSON-encoded string + \ArangoDBClient\Document::toJson() + + Returns the document as JSON-encoded string - + + array + + string + + $options + array() + array + - + toSerialized - \ArangoDBClient\Collection::toSerialized() - - Returns the collection as a serialized string + \ArangoDBClient\Document::toSerialized() + + Returns the document as a serialized string - + + array + + string + + $options + array() + array + - - getAll - \ArangoDBClient\Collection::getAll() - - Get all collection attributes + + filterHiddenAttributes + \ArangoDBClient\Document::filterHiddenAttributes() + + Returns the attributes with the hidden ones removed - + + array + + + array + + array + + $attributes + + array + + + $_hiddenAttributes + array() + array + - + set - \ArangoDBClient\Collection::set() - - Set a collection attribute + \ArangoDBClient\Document::set() + + Set a document attribute The key (attribute name) must be a string. - This will validate the value of the attribute and might throw an exception if the value is invalid. - + \ArangoDBClient\ClientException - + string - + mixed - + void @@ -16441,277 +17015,232 @@ exception if the value is invalid. mixed - - setId - \ArangoDBClient\Collection::setId() - - Set the collection id - This will throw if the id of an existing collection gets updated to some other id - + + __set + \ArangoDBClient\Document::__set() + + Set a document attribute, magic method + This is a magic method that allows the object to be used without +declaring all document attributes first. +This function is mapped to set() internally. + \ArangoDBClient\ClientException - + + + string + + mixed - - boolean + + void - $id + $key + + string + + + $value mixed - - getId - \ArangoDBClient\Collection::getId() - - Get the collection id (if already known) - Collection ids are generated on the server only. - -Collection ids are numeric but might be bigger than PHP_INT_MAX. -To reliably store a collection id elsewhere, a PHP string should be used - - mixed - - - - - setName - \ArangoDBClient\Collection::setName() - - Set the collection name + + get + \ArangoDBClient\Document::get() + + Get a document attribute - - \ArangoDBClient\ClientException - - + string - - void + + mixed - $name + $key string - - getName - \ArangoDBClient\Collection::getName() - - Get the collection name (if already known) - - + + __get + \ArangoDBClient\Document::__get() + + Get a document attribute, magic method + This function is mapped to get() internally. + + string - - - - setType - \ArangoDBClient\Collection::setType() - - Set the collection type. - This is useful before a collection is create() 'ed in order to set a different type than the normal one. -For example this must be set to 3 in order to create an edge-collection. - - \ArangoDBClient\ClientException - - - integer - - - void + + mixed - $type + $key - integer + string - - getType - \ArangoDBClient\Collection::getType() - - Get the collection type (if already known) + + __isset + \ArangoDBClient\Document::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. - + string - - - - - setStatus - \ArangoDBClient\Collection::setStatus() - - Set the collection status. - This is useful before a collection is create()'ed in order to set a status. - - \ArangoDBClient\ClientException - - - integer - - - void + + + boolean - $status + $key - integer + string - - getStatus - \ArangoDBClient\Collection::getStatus() - - Get the collection status (if already known) - - - integer - + + __unset + \ArangoDBClient\Document::__unset() + + Magic method to unset an attribute. + Caution!!! This works only on the first array level. +The preferred method to unset attributes in the database, is to set those to null and do an update() with the option: 'keepNull' => false. + + + + $key + + + - - setKeyOptions - \ArangoDBClient\Collection::setKeyOptions() - - Set the collection key options. + + getAll + \ArangoDBClient\Document::getAll() + + Get all document attributes - - \ArangoDBClient\ClientException + + mixed - + array - - void - - $keyOptions - - array + $options + array() + mixed - - getKeyOptions - \ArangoDBClient\Collection::getKeyOptions() - - Get the collection key options (if already known) + + getAllForInsertUpdate + \ArangoDBClient\Document::getAllForInsertUpdate() + + Get all document attributes for insertion/update - - array + + mixed - - setWaitForSync - \ArangoDBClient\Collection::setWaitForSync() - - Set the waitForSync value + + getAllAsObject + \ArangoDBClient\Document::getAllAsObject() + + Get all document attributes, and return an empty object if the documentapped into a DocumentWrapper class - - boolean + + mixed - - void + + mixed - $value - - boolean + $options + array() + mixed - - getWaitForSync - \ArangoDBClient\Collection::getWaitForSync() - - Get the waitForSync value (if already known) - - - boolean - - - - - setJournalSize - \ArangoDBClient\Collection::setJournalSize() - - Set the journalSize value + + setHiddenAttributes + \ArangoDBClient\Document::setHiddenAttributes() + + Set the hidden attributes +$cursor - - integer + + array - + void - $value + $attributes - integer + array - - getJournalSize - \ArangoDBClient\Collection::getJournalSize() - - Get the journalSize value (if already known) + + getHiddenAttributes + \ArangoDBClient\Document::getHiddenAttributes() + + Get the hidden attributes - - integer + + array - - setIsSystem - \ArangoDBClient\Collection::setIsSystem() - - Set the isSystem value + + isIgnoreHiddenAttributes + \ArangoDBClient\Document::isIgnoreHiddenAttributes() + + - + boolean - - void + + + + setIgnoreHiddenAttributes + \ArangoDBClient\Document::setIgnoreHiddenAttributes() + + + + + boolean - $value + $ignoreHiddenAttributes boolean - - getIsSystem - \ArangoDBClient\Collection::getIsSystem() - - Get the isSystem value (if already known) + + setChanged + \ArangoDBClient\Document::setChanged() + + Set the changed flag - + boolean - - - - setIsVolatile - \ArangoDBClient\Collection::setIsVolatile() - - Set the isVolatile value - - + boolean - - void - $value @@ -16719,1179 +17248,1094 @@ For example this must be set to 3 in order to create an edge-collection.boolean - - getIsVolatile - \ArangoDBClient\Collection::getIsVolatile() - - Get the isVolatile value (if already known) + + getChanged + \ArangoDBClient\Document::getChanged() + + Get the changed flag - + boolean - - setNumberOfShards - \ArangoDBClient\Collection::setNumberOfShards() - - Set the numberOfShards value + + setIsNew + \ArangoDBClient\Document::setIsNew() + + Set the isNew flag - - integer + + boolean - + void - $value + $isNew - integer + boolean - - getNumberOfShards - \ArangoDBClient\Collection::getNumberOfShards() - - Get the numberOfShards value (if already known) + + getIsNew + \ArangoDBClient\Document::getIsNew() + + Get the isNew flag - - mixed + + boolean - - setReplicationFactor - \ArangoDBClient\Collection::setReplicationFactor() - - Set the replicationFactor value - - - integer + + setInternalId + \ArangoDBClient\Document::setInternalId() + + Set the internal document id + This will throw if the id of an existing document gets updated to some other id + + \ArangoDBClient\ClientException + + + string - + void - $value + $id - integer + string - - getReplicationFactor - \ArangoDBClient\Collection::getReplicationFactor() - - Get the replicationFactor value (if already known) - - - mixed + + setInternalKey + \ArangoDBClient\Document::setInternalKey() + + Set the internal document key + This will throw if the key of an existing document gets updated to some other key + + \ArangoDBClient\ClientException - - - - setShardingStrategy - \ArangoDBClient\Collection::setShardingStrategy() - - Set the shardingStragy value - - + string - + void - $value + $key string - - getShardingStrategy - \ArangoDBClient\Collection::getShardingStrategy() - - Get the sharding strategy value (if already known) - - - mixed + + getInternalId + \ArangoDBClient\Document::getInternalId() + + Get the internal document id (if already known) + Document ids are generated on the server only. Document ids consist of collection id and +document id, in the format collectionId/documentId + + string - - setShardKeys - \ArangoDBClient\Collection::setShardKeys() - - Set the shardKeys value + + getInternalKey + \ArangoDBClient\Document::getInternalKey() + + Get the internal document key (if already known) - - array - - - void + + string - - $value - - array - - - getShardKeys - \ArangoDBClient\Collection::getShardKeys() - - Get the shardKeys value (if already known) - - - array + + getHandle + \ArangoDBClient\Document::getHandle() + + Convenience function to get the document handle (if already known) - is an alias to getInternalId() + Document handles are generated on the server only. Document handles consist of collection id and +document id, in the format collectionId/documentId + + string - - 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 - - + + getId + \ArangoDBClient\Document::getId() + + Get the document id (or document handle) if already known. + It is a string and consists of the collection's name and the document key (_key attribute) separated by /. +Example: (collectionname/documentId) + +The document handle is stored in a document's _id attribute. + + mixed + + + + + getKey + \ArangoDBClient\Document::getKey() + + Get the document key (if already known). + Alias function for getInternalKey() + + mixed + + + + + getCollectionId + \ArangoDBClient\Document::getCollectionId() + + Get the collection id (if already known) + Collection ids are generated on the server only. Collection ids are numeric but might be +bigger than PHP_INT_MAX. To reliably store a collection id elsewhere, a PHP string should be used + + mixed + + + + + setRevision + \ArangoDBClient\Document::setRevision() + + Set the document revision + Revision ids are generated on the server only. + +Document ids are strings, even if they look "numeric" +To reliably store a document id elsewhere, a PHP string must be used + + mixed + + + void + + + + $rev + + mixed + + + + getRevision + \ArangoDBClient\Document::getRevision() + + Get the document revision (if already known) + + + mixed + + + + + jsonSerialize + \ArangoDBClient\Document::jsonSerialize() + + Get all document attributes +Alias function for getAll() - it's necessary for implementing JsonSerializable interface + + + mixed + + + array + + + + $options + array() + mixed + + + + + No summary for method isIgnoreHiddenAttributes() + No summary for method setIgnoreHiddenAttributes() + + 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 + + - ArangoDB PHP client: HTTP response + ArangoDB PHP client: single vertex document + + - - HttpResponse - \ArangoDBClient\HttpResponse + \ArangoDBClient\Document + Vertex + \ArangoDBClient\Vertex - Container class for HTTP responses + Value object representing a single vertex document <br> - + + - - HEADER_LOCATION - \ArangoDBClient\HttpResponse::HEADER_LOCATION - 'location' - - HTTP location header + + ENTRY_ID + \ArangoDBClient\Document::ENTRY_ID + '_id' + + Document id index - - HEADER_LEADER_ENDPOINT - \ArangoDBClient\HttpResponse::HEADER_LEADER_ENDPOINT - 'x-arango-endpoint' - - HTTP leader endpoint header, used in failover + + ENTRY_KEY + \ArangoDBClient\Document::ENTRY_KEY + '_key' + + Document key index - - $_header - \ArangoDBClient\HttpResponse::_header - '' - - The header retrieved + + ENTRY_REV + \ArangoDBClient\Document::ENTRY_REV + '_rev' + + Revision id index - - string - - - - $_body - \ArangoDBClient\HttpResponse::_body - '' - - The body retrieved + + + ENTRY_ISNEW + \ArangoDBClient\Document::ENTRY_ISNEW + '_isNew' + + isNew id index - - string - - - - $_headers - \ArangoDBClient\HttpResponse::_headers - array() - - All headers retrieved as an assoc array + + + ENTRY_HIDDENATTRIBUTES + \ArangoDBClient\Document::ENTRY_HIDDENATTRIBUTES + '_hiddenAttributes' + + hidden attribute index - - array - - - - $_result - \ArangoDBClient\HttpResponse::_result - '' - - The result status-line (first line of HTTP response header) + + + ENTRY_IGNOREHIDDENATTRIBUTES + \ArangoDBClient\Document::ENTRY_IGNOREHIDDENATTRIBUTES + '_ignoreHiddenAttributes' + + hidden attribute index - + + + + OPTION_WAIT_FOR_SYNC + \ArangoDBClient\Document::OPTION_WAIT_FOR_SYNC + 'waitForSync' + + waitForSync option index + + + + + OPTION_POLICY + \ArangoDBClient\Document::OPTION_POLICY + 'policy' + + policy option index + + + + + OPTION_KEEPNULL + \ArangoDBClient\Document::OPTION_KEEPNULL + 'keepNull' + + keepNull option index + + + + + KEY_REGEX_PART + \ArangoDBClient\Document::KEY_REGEX_PART + '[a-zA-Z0-9_:.@\\-()+,=;$!*\'%]{1,254}' + + regular expression used for key validation + + + + + $_id + \ArangoDBClient\Document::_id + + + The document id (might be NULL for new documents) + + string - - $_httpCode - \ArangoDBClient\HttpResponse::_httpCode + + $_key + \ArangoDBClient\Document::_key - - The HTTP status code of the response + + The document key (might be NULL for new documents) - - integer + + string - - $_wasAsync - \ArangoDBClient\HttpResponse::_wasAsync - false - - Whether or not the response is for an async request without a response body + + $_rev + \ArangoDBClient\Document::_rev + + + The document revision (might be NULL for new documents) - - boolean + + mixed - - $batchPart - \ArangoDBClient\HttpResponse::batchPart - - - Whether or not the response is for an async request without a response body + + $_values + \ArangoDBClient\Document::_values + array() + + The document attributes (names/values) - - \ArangoDBClient\Batchpart + + array - - __construct - \ArangoDBClient\HttpResponse::__construct() - - Set up the response + + $_changed + \ArangoDBClient\Document::_changed + false + + Flag to indicate whether document was changed locally - - string + + boolean - - string + + + + $_isNew + \ArangoDBClient\Document::_isNew + true + + Flag to indicate whether document is a new document (never been saved to the server) + + + boolean - - string + + + + $_doValidate + \ArangoDBClient\Document::_doValidate + false + + Flag to indicate whether validation of document values should be performed +This can be turned on, but has a performance penalty + + + boolean - + + + + $_hiddenAttributes + \ArangoDBClient\Document::_hiddenAttributes + array() + + An array, that defines which attributes should be treated as hidden. + + + array + + + + + $_ignoreHiddenAttributes + \ArangoDBClient\Document::_ignoreHiddenAttributes + false + + Flag to indicate whether hidden attributes should be ignored or included in returned data-sets + + boolean - - \ArangoDBClient\ClientException + + + + __construct + \ArangoDBClient\Document::__construct() + + Constructs an empty document + + + array - $responseString - - string - - - $originUrl - null - string - - - $originMethod + $options null - string - - - $wasAsync - false - boolean + array + \ArangoDBClient\Document - - getHttpCode - \ArangoDBClient\HttpResponse::getHttpCode() - - Return the HTTP status code of the response + + createFromArray + \ArangoDBClient\Document::createFromArray() + + Factory method to construct a new document using the values passed to populate it - - integer + + \ArangoDBClient\ClientException - - - - getHeader - \ArangoDBClient\HttpResponse::getHeader() - - Return an individual HTTP headers of the response - - - string + + array - - string + + array + + + \ArangoDBClient\Document + \ArangoDBClient\Edge + \ArangoDBClient\Graph - $name + $values - string + array + + $options + array() + array + + \ArangoDBClient\Document - - getHeaders - \ArangoDBClient\HttpResponse::getHeaders() - - Return the HTTP headers of the response - - - array + + __clone + \ArangoDBClient\Document::__clone() + + Clone a document + Returns the clone + + + void + \ArangoDBClient\Document - - getLocationHeader - \ArangoDBClient\HttpResponse::getLocationHeader() - - Return the location HTTP header of the response - - + + __toString + \ArangoDBClient\Document::__toString() + + Get a string representation of the document. + It will not output hidden attributes. + +Returns the document as JSON-encoded string + + string + \ArangoDBClient\Document - - getLeaderEndpointHeader - \ArangoDBClient\HttpResponse::getLeaderEndpointHeader() - - Return the leader location HTTP header of the response + + toJson + \ArangoDBClient\Document::toJson() + + Returns the document as JSON-encoded string - - string + + array - - - - getBody - \ArangoDBClient\HttpResponse::getBody() - - Return the body of the response - - + string + + $options + array() + array + + \ArangoDBClient\Document - - getResult - \ArangoDBClient\HttpResponse::getResult() - - Return the result line (first header line) of the response + + toSerialized + \ArangoDBClient\Document::toSerialized() + + Returns the document as a serialized string - + + array + + string + + $options + array() + array + + \ArangoDBClient\Document - - getJson - \ArangoDBClient\HttpResponse::getJson() - - Return the data from the JSON-encoded body + + filterHiddenAttributes + \ArangoDBClient\Document::filterHiddenAttributes() + + Returns the attributes with the hidden ones removed - - \ArangoDBClient\ClientException - - + array - - - - setBatchPart - \ArangoDBClient\HttpResponse::setBatchPart() - - - - - \ArangoDBClient\Batchpart + + array - - \ArangoDBClient\HttpResponse + + array - $batchPart + $attributes - \ArangoDBClient\Batchpart + array - - - getBatchPart - \ArangoDBClient\HttpResponse::getBatchPart() - - - - - \ArangoDBClient\Batchpart - - - - - - No summary for method setBatchPart() - No summary for method getBatchPart() - - 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 - - - - ArangoDB PHP client: http helper methods - - - - - - - - HttpHelper - \ArangoDBClient\HttpHelper - - Helper methods for HTTP request/response handling - - - - - - METHOD_POST - \ArangoDBClient\HttpHelper::METHOD_POST - 'POST' - - HTTP POST string constant - - - - - METHOD_PUT - \ArangoDBClient\HttpHelper::METHOD_PUT - 'PUT' - - HTTP PUT string constant - - - - - METHOD_DELETE - \ArangoDBClient\HttpHelper::METHOD_DELETE - 'DELETE' - - HTTP DELETE string constant - - - - - METHOD_GET - \ArangoDBClient\HttpHelper::METHOD_GET - 'GET' - - HTTP GET string constant - - - - - METHOD_HEAD - \ArangoDBClient\HttpHelper::METHOD_HEAD - 'HEAD' - - HTTP HEAD string constant - - - - - METHOD_PATCH - \ArangoDBClient\HttpHelper::METHOD_PATCH - 'PATCH' - - HTTP PATCH string constant - - - - - CHUNK_SIZE - \ArangoDBClient\HttpHelper::CHUNK_SIZE - 8192 - - Chunk size (number of bytes processed in one batch) - - - - - EOL - \ArangoDBClient\HttpHelper::EOL - "\r\n" - - End of line mark used in HTTP - - - - - SEPARATOR - \ArangoDBClient\HttpHelper::SEPARATOR - "\r\n\r\n" - - Separator between header and body - - - - - PROTOCOL - \ArangoDBClient\HttpHelper::PROTOCOL - 'HTTP/1.1' - - HTTP protocol version used, hard-coded to version 1.1 - - - - - MIME_BOUNDARY - \ArangoDBClient\HttpHelper::MIME_BOUNDARY - 'XXXsubpartXXX' - - Boundary string for batch request parts - - - - - ASYNC_HEADER - \ArangoDBClient\HttpHelper::ASYNC_HEADER - 'X-Arango-Async' - - HTTP Header for making an operation asynchronous - - - - - createConnection - \ArangoDBClient\HttpHelper::createConnection() - - Create a one-time HTTP connection by opening a socket to the server - It is the caller's responsibility to close the socket - - \ArangoDBClient\ConnectException - - - \ArangoDBClient\ConnectionOptions - - - resource - - - $options - - \ArangoDBClient\ConnectionOptions + $_hiddenAttributes + array() + array + \ArangoDBClient\Document - - buildRequest - \ArangoDBClient\HttpHelper::buildRequest() - - Create a request string (header and body) - - - \ArangoDBClient\ConnectionOptions - - - string - - - string - - - string + + set + \ArangoDBClient\Document::set() + + Set a document attribute + The key (attribute name) must be a string. +This will validate the value of the attribute and might throw an +exception if the value is invalid. + + \ArangoDBClient\ClientException - + string - - array - - - string + + mixed - - \ArangoDBClient\ClientException + + void - $options - - \ArangoDBClient\ConnectionOptions - - - $connectionHeader + $key string - $method + $value - string + mixed + \ArangoDBClient\Document + + + __set + \ArangoDBClient\Document::__set() + + Set a document attribute, magic method + This is a magic method that allows the object to be used without +declaring all document attributes first. +This function is mapped to set() internally. + + \ArangoDBClient\ClientException + + + + string + + + mixed + + + void + + - $url + $key string - $body + $value - string - - - $customHeaders - array() - array + mixed + \ArangoDBClient\Document - - validateMethod - \ArangoDBClient\HttpHelper::validateMethod() - - Validate an HTTP request method name + + get + \ArangoDBClient\Document::get() + + Get a document attribute - - \ArangoDBClient\ClientException - - + string - - boolean + + mixed - $method + $key string + \ArangoDBClient\Document - - transfer - \ArangoDBClient\HttpHelper::transfer() - - Execute an HTTP request on an opened socket - It is the caller's responsibility to close the socket - - resource - - - string - - + + __get + \ArangoDBClient\Document::__get() + + Get a document attribute, magic method + This function is mapped to get() internally. + + string - - \ArangoDBClient\ClientException - - - string + + mixed - $socket - - resource - - - $request - - string - - - $method + $key string + \ArangoDBClient\Document - - parseHttpMessage - \ArangoDBClient\HttpHelper::parseHttpMessage() - - Splits an http message into its header and body. + + __isset + \ArangoDBClient\Document::__isset() + + Is triggered by calling isset() or empty() on inaccessible properties. - - string - - + string - - string - - - \ArangoDBClient\ClientException - - - array + + boolean - $httpMessage + $key string + \ArangoDBClient\Document + + + __unset + \ArangoDBClient\Document::__unset() + + Magic method to unset an attribute. + Caution!!! This works only on the first array level. +The preferred method to unset attributes in the database, is to set those to null and do an update() with the option: 'keepNull' => false. + + + - $originUrl - null - string - - - $originMethod - null - string + $key + + + \ArangoDBClient\Document - - parseHeaders - \ArangoDBClient\HttpHelper::parseHeaders() - - Process a string of HTTP headers into an array of header => values. + + getAll + \ArangoDBClient\Document::getAll() + + Get all document attributes - - string + + mixed - + array - $headers - - string + $options + array() + mixed + \ArangoDBClient\Document - - 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 - - - - ArangoDB PHP client: update policies - - - - - - - - UpdatePolicy - \ArangoDBClient\UpdatePolicy - - Document update policies - - - - - - LAST - \ArangoDBClient\UpdatePolicy::LAST - 'last' - - last update will win in case of conflicting versions + + getAllForInsertUpdate + \ArangoDBClient\Document::getAllForInsertUpdate() + + Get all document attributes for insertion/update + + mixed + - - - ERROR - \ArangoDBClient\UpdatePolicy::ERROR - 'error' - - an error will be returned in case of conflicting versions + \ArangoDBClient\Document + + + getAllAsObject + \ArangoDBClient\Document::getAllAsObject() + + Get all document attributes, and return an empty object if the documentapped into a DocumentWrapper class + + mixed + + + mixed + - - - validate - \ArangoDBClient\UpdatePolicy::validate() - - Check if the supplied policy value is valid + + $options + array() + mixed + + \ArangoDBClient\Document + + + setHiddenAttributes + \ArangoDBClient\Document::setHiddenAttributes() + + Set the hidden attributes +$cursor - - \ArangoDBClient\ClientException - - - string + + array - + void - $value + $attributes - string + array + \ArangoDBClient\Document - - eJydU2Fr2zAQ/e5fcYNRJyFdunx0G9ouLe3GYCFdvwWKopxtUVsSkpwslP73nSTHpF6hMGFko7v33t07+eJSlzpJJqNRAiO4NkwW6uYbLO4XwCuB0mXQ6A1zCFpVggu0lOdTrzTjz6xAgA41D4AQZI0rlaEY/GASHhxizaQMIa703oiidDDvvqZnX6djcEYQobRwV6/vxxSuVCFxDHdoCL0n9CRJJKvRkjb2ZM+7Jm4Ub2o6+ajwd8q2QnLf0dmXaVDjFbMWHgPPwtPsk5fEdxWk/BoBpXRSO1FVtEmghzOLoHLgSuaEdEIWsEVjhZK2xU7CmxKI4ef1w2+YQerpUmqmp0IuojFkaZBYIxh0jZG4+Q+p2+Xy19JrBcZ3xOYl8mcQObgSwTZak0Ob6OMetqxqEIT1H2LTQg7IK1catbMQPb39w1E7qqKfpZlhNVgaOFX6OTKevplXq9MHxq5hqzrl2Jhu1gQiRubolTeSe9lYInEOosYw5MYJ+kXDReMGwj7FUg5pw9YSv8iF9hg+zWZgscqzLAzr5AT+CQRrh0cSfgVPQOKub8sg/S5DiW9bT0n/gH1N4v6axMv4ROnMDo6vZJaFyBjS1eEPWrV3e706TvS8fwH05C35 - - - - ArangoDB PHP client: exception base class - - - - - - - \Exception - Exception - \ArangoDBClient\Exception - - Exception base class used to throw Arango specific exceptions - <br> - - - - - $enableLogging - \ArangoDBClient\Exception::enableLogging - false - - + + getHiddenAttributes + \ArangoDBClient\Document::getHiddenAttributes() + + Get the hidden attributes + + array + - - - __construct - \ArangoDBClient\Exception::__construct() - - Exception constructor. + \ArangoDBClient\Document + + + isIgnoreHiddenAttributes + \ArangoDBClient\Document::isIgnoreHiddenAttributes() + + - - string - - - integer + + boolean - - \Exception + + \ArangoDBClient\Document + + + setIgnoreHiddenAttributes + \ArangoDBClient\Document::setIgnoreHiddenAttributes() + + + + + boolean - $message - '' - string - - - $code - 0 - integer + $ignoreHiddenAttributes + + boolean + \ArangoDBClient\Document + + + setChanged + \ArangoDBClient\Document::setChanged() + + Set the changed flag + + + boolean + + + boolean + + - $previous - null - \Exception + $value + + boolean + \ArangoDBClient\Document - - enableLogging - \ArangoDBClient\Exception::enableLogging() - - Turn on exception logging + + getChanged + \ArangoDBClient\Document::getChanged() + + Get the changed flag + + boolean + + \ArangoDBClient\Document - - disableLogging - \ArangoDBClient\Exception::disableLogging() - - Turn off exception logging - - - - - - No summary for property $enableLogging - - eJydVF1vmzAUfedX3AckoGJJlkfaZu26qtVUaZXSx0jIOBewRmxkmy7VtP++i8NHgtJpql9sfM+599wPfPWlLmvPm19ceHABt5rJQn37Cs+Pz8ArgdImgHuOtRVKQsYM0jUzhsAt/qZm/CcrEGCg3jmWM7LGlkqTDb4zCWuLuGNSOhNX9ZsWRWnhbjgtF5+XMVgtyKE08LDLHmMyV6qQGMMDamK/EXvueZLt0FBsnIS9HDK5PyMaGoNbsApsqdWvjgqmRi5ywcc8++yuMr36r0SNkLw1ASxmS6fwEG8UgXuLcmtgM1x5v72W4OS261gyJw1WN9wqPeusPYiEaLYDMgtZuDufSmFI2gQhpIVu+Vxtp+ZRCPi1xlehGtNB5m6vm6yiouSN5A6VpoOqsA8J1xAE8cE/nRfxWbdkkU1VRc7tIet2iRxCg1WeJD5KllX4pIqCkoqOMO26Qa2VTmkMwgJt6iob+rYUJoIZBAkEtPWKosv3uMHaUgtpvGhqkmCCy5VGxksIcV9XlExI85/e/3ii3NpAn1YU+aVl3pq1q3wYRcAM+AKuV+BXQuJU9jQ8fTqhDnsa/Y83noYjtan9+5Jzde9KHo817jx2/KOhemm0BDeAfV+qQ5nPNdtYZo97ftKXcNrAc82jXpNU/LeaPP+YnK0wH9CTs8qcCqq1eGUWe//vMQjthi1llWAmHCY7Sdx1DMGmf6w23aOQjfPfjthfI0+USQ== - - - - ArangoDB PHP client: endpoint - - - - - - - - Endpoint - \ArangoDBClient\Endpoint - - Endpoint specification - An endpoint contains the server location the client connects to -the following endpoint types are currently supported (more to be added later): -<ul> -<li> tcp://host:port for tcp connections -<li> unix://socket for UNIX sockets (provided the server supports this) -<li> ssl://host:port for SSL connections (provided the server supports this) -</ul> - -Note: SSL support is added in ArangoDB server 1.1<br> - -<br> - - - - - TYPE_TCP - \ArangoDBClient\Endpoint::TYPE_TCP - 'tcp' - - TCP endpoint type - - - - - TYPE_SSL - \ArangoDBClient\Endpoint::TYPE_SSL - 'ssl' - - SSL endpoint type - - - - - TYPE_UNIX - \ArangoDBClient\Endpoint::TYPE_UNIX - 'unix' - - UNIX socket endpoint type - - - - - REGEXP_TCP - \ArangoDBClient\Endpoint::REGEXP_TCP - '/^(tcp|http):\/\/(.+?):(\d+)\/?$/' - - Regexp for TCP endpoints - - - - - REGEXP_SSL - \ArangoDBClient\Endpoint::REGEXP_SSL - '/^(ssl|https):\/\/(.+?):(\d+)\/?$/' - - Regexp for SSL endpoints - - - - - REGEXP_UNIX - \ArangoDBClient\Endpoint::REGEXP_UNIX - '/^unix:\/\/(.+)$/' - - Regexp for UNIX socket endpoints - - - - - ENTRY_ENDPOINT - \ArangoDBClient\Endpoint::ENTRY_ENDPOINT - 'endpoint' - - Endpoint index - - - - - ENTRY_DATABASES - \ArangoDBClient\Endpoint::ENTRY_DATABASES - 'databases' - - Databases index - - - - - $_value - \ArangoDBClient\Endpoint::_value - - - Current endpoint value - - - string - - - - - __construct - \ArangoDBClient\Endpoint::__construct() - - Create a new endpoint + + setIsNew + \ArangoDBClient\Document::setIsNew() + + Set the isNew flag - - string + + boolean - - \ArangoDBClient\ClientException + + void - $value + $isNew - string + boolean + \ArangoDBClient\Document - - __toString - \ArangoDBClient\Endpoint::__toString() - - Return a string representation of the endpoint + + getIsNew + \ArangoDBClient\Document::getIsNew() + + Get the isNew flag - - - string + + boolean + \ArangoDBClient\Document - - getType - \ArangoDBClient\Endpoint::getType() - - Return the type of an endpoint - - - string + + setInternalId + \ArangoDBClient\Document::setInternalId() + + Set the internal document id + This will throw if the id of an existing document gets updated to some other id + + \ArangoDBClient\ClientException - + string + + void + - $value + $id string + \ArangoDBClient\Document - - normalize - \ArangoDBClient\Endpoint::normalize() - - Return normalize an endpoint string - will convert http: into tcp:, and https: into ssl: - - - string + + setInternalKey + \ArangoDBClient\Document::setInternalKey() + + Set the internal document key + This will throw if the key of an existing document gets updated to some other key + + \ArangoDBClient\ClientException - + string + + void + - $value + $key string + \ArangoDBClient\Document - - getHost - \ArangoDBClient\Endpoint::getHost() - - Return the host name of an endpoint - - - string - - + + getInternalId + \ArangoDBClient\Document::getInternalId() + + Get the internal document id (if already known) + Document ids are generated on the server only. Document ids consist of collection id and +document id, in the format collectionId/documentId + string - - $value - - string - + \ArangoDBClient\Document - - isValid - \ArangoDBClient\Endpoint::isValid() - - check whether an endpoint specification is valid + + getInternalKey + \ArangoDBClient\Document::getInternalKey() + + Get the internal document key (if already known) - + string - - boolean + + \ArangoDBClient\Document + + + getHandle + \ArangoDBClient\Document::getHandle() + + Convenience function to get the document handle (if already known) - is an alias to getInternalId() + Document handles are generated on the server only. Document handles consist of collection id and +document id, in the format collectionId/documentId + + string - - $value - - - + \ArangoDBClient\Document - - listEndpoints - \ArangoDBClient\Endpoint::listEndpoints() - - List endpoints - This will list the endpoints that are configured on the server - - \ArangoDBClient\Connection + + getId + \ArangoDBClient\Document::getId() + + Get the document id (or document handle) if already known. + It is a string and consists of the collection's name and the document key (_key attribute) separated by /. +Example: (collectionname/documentId) + +The document handle is stored in a document's _id attribute. + + mixed - - - array + + \ArangoDBClient\Document + + + getKey + \ArangoDBClient\Document::getKey() + + Get the document key (if already known). + Alias function for getInternalKey() + + mixed - - \ArangoDBClient\Exception + + \ArangoDBClient\Document + + + getCollectionId + \ArangoDBClient\Document::getCollectionId() + + Get the collection id (if already known) + Collection ids are generated on the server only. Collection ids are numeric but might be +bigger than PHP_INT_MAX. To reliably store a collection id elsewhere, a PHP string should be used + + mixed + + + \ArangoDBClient\Document + + + setRevision + \ArangoDBClient\Document::setRevision() + + Set the document revision + Revision ids are generated on the server only. + +Document ids are strings, even if they look "numeric" +To reliably store a document id elsewhere, a PHP string must be used + + mixed + + + void - $connection + $rev - \ArangoDBClient\Connection + mixed + \ArangoDBClient\Document - - normalizeHostname - \ArangoDBClient\Endpoint::normalizeHostname() - - Replaces "localhost" in hostname with "[::1]" in order to make these values the same -for later comparisons + + getRevision + \ArangoDBClient\Document::getRevision() + + Get the document revision (if already known) - - string + + mixed - - string + + \ArangoDBClient\Document + + + jsonSerialize + \ArangoDBClient\Document::jsonSerialize() + + Get all document attributes +Alias function for getAll() - it's necessary for implementing JsonSerializable interface + + + mixed + + + array - $hostname - - string + $options + array() + mixed + \ArangoDBClient\Document - - Name of argument $value does not match with the DocBlock's name $mixed in isValid() - Parameter $mixed could not be found in isValid() - - eJy9WG1v2zYQ/u5fcTM8RE4dK8mXAWqTNEuNpkWRBYk7tIhTg5Zpm4hMCiSdly397ztSpCzJsut0w4wglsnjcy987njUm5N0ljYa4e5uA3bhVBI+Fe9+h8vzS4gTRrmOgPJxKhjXKGBk3qYkviNTCpCLn1lJO0kWeiYkzsFHwuFaUzonnNupWKRPkk1nGs7yp8P9g8MOaMkQkCt4Px+dd3A6EVNOO/CeSlz9hKvDRoOTOVWom1bUvs6t7zlDQaU0ZhMWE80Ed2af8twRiAXXhKE+PaOgqLynEhKRiduxzHUjx2msUU4YCDMzEUkiHhifLtH0U0oVEInLFlLiuuQJ1CJNhdR0DMFc4IwWMKJAxmMcSYimsh0ZxDeL5Nh+J+wYdJxGYTgTSkdmLaqSZsxbgbapXHbB2SMKKxHf0Uzy88WHL5D9VhCkUtwzo6zgobPJeM1UO4dSKllRe339qah2a7ww88c8XwhNIwvk5IApFwDGl0RzWAfdgzcj6dcWHjezTTEemymA/e6hpUmcEKVyJjT+bphJyw/z2YWzbIuWu3dPkgV1s17o7T1B95CVfOqGQvudSnaPmwetoV2FzKug988uy7woLceIKg39r5e9oRE8gh3c3p1VFBO0rVCMIKLgDtagFAixHZpdgHCGWzV4V3RKH1NLj6Kbqgbuqve+9+XSOxl+C9DP55nWaTsahIMw6L46aUfBYPyqPQhPWuFmZcVobFDmYoHKMBxWmfoZbXVR26DVxyz8ZjPS6WvXasnLE+Nj+liD2bvoX30d9i7eXf7x4aJvYL0FNWjviCYjorDybIZ7d9o//f30undt8MZ+kQFcSQ1JDbkJcPpQKPrlzEiJJHOXG9CyaQB7S35VKm95rZ5J8aAgy9/eY0zTVSmXaItRwmKYLLgtQDAcWpfkItZBprRt5bL0Nh82geAXRZNJFDH1J0nY2Au2C1LmY62wPlYMCRTmN9eToMn4vUFY4xbs/Kp2mh3w+K9z+O+N/LFliuLecVYoMPQtVzEKYiUC6oXkGHoXWElTSRUalykUE1t31+3JnExZXB2UGaQD3HsR8rpN0OLaogTV6DtlJad/4KtRa6qRMYHw/4Rv9bW8Goj1tdA5rExsCn5Pqe6j6AbiYUinwznR8SzIKLgsgEuaVGjozbLy/kyopdImDVj1XqABpV+swVS4F6gw4rU6nChfJIlnhvm//LdKES6w/UvYX7RIkOVGPrAkMaUO+wcNpuBHWAqx0TJ9VAeXjO2gcqOmzXkpuYodwFo+5VaO16zcSK589Rp6OW12dzB3E+x/gxtohtbfEKtQ9qjwGW47gFPGfTNuHLZjDniLfDRNIJg++39Pylzzlgl5jvL/LiHx2wpQtY7VpZg3w2/LkLsQe4Cbw9v6Q2DLzP05U1Rmi93mLWypyb8qE3B9fAcPM4pckOWcK+0oNvL2fNxMizl7xJTYTAsIYlRjbkZ+mbCKiZTkyZAwG1XtNfwZCZGgCmwMqAn2D+ztwIQkCslt/HtgaiuyVbqJGrIxNczMXNdxtHwTcOMfb4tb5J/KvQyi2ih4UHh+xmK34Dnt4ejoCPbXEMY6WssDbHIpiWfgYIAoaNG0CuNN8I6hRFVkvbayWzYC9qQ/cgdFfqAi6uvGil4njN4Zsv6s2u9V5huS5MyvUv8TU6v9vp/sY1eTnTaJESs2TObyS3R2+Rd8wqYLiaR3bxGyu219lpzlt2toLW/ahsszWrh6uxcHC0VXsi1h/M6dcGE4FrHqEntBHo+6sZiH5/3+ZeivHCq0l4TuTM+Tag5ludbCrjDFHpue2p976DQFP5bJdKuN/KB8Ix9UW/qNeWVCmZsX1Iejmm25kaahXortHSOjgs8yUVH0+epTfoMqkst3qB7BrvmosOtvr7QjpcPR1lwFTfN+KDHHVNO8vzAP9qB8YHoGzZsoOri1E0KOsXbirs3JHTWbicbaRHMvm5ZHnL1u2ndBuN9zZAVT9g1PHVt8Tc3V7i0teEF/4te8qDE5d4uCXHsxJcMQ3LlUCpENi42KKTCOmDAWVG3sbJruXUF+hT9xd/gc+vng8LdBd9/+HbSzI3AwOMAUsNrMUbgMU3lrMe3t26EhukVU4MkXRXa0AzsD/x7SE3s08EI7CPUPvDch/w== + eJylUMtKw0AU3c9XnF01BGuzTAUfLbYIQkHoKiA300sSm8yEmYk0iP/ubWK7qEt3w3ndc+buvi1bpaZRpBDh0ZEp7PIJm/UGuq7YhBS+MkXN+GQX+ICd1V0juMiPjoeW9J4KBs7mxeAbSOpCaZ1weCGDt8DckDEX1LP49nilnt3AaNv2rirKgMX5ldzOkhjBVXLKeKyafB0LXdvCcIwVO8ntB7e01cc2wOwmEWSqlKGGvfTki4rz8+4t1R3D5h+sAxy3jr3wshv0n/l/u+iavMd2zOJDYLPzWJ4yv5T6VqPmneqK/NWoTNMBizHJTl+Q/Z7Ls1EyuZ6rH7e+kY0= @@ -18082,23 +18526,23 @@ This is a convenience function that calls json_encode_wrapper on the connection< \ArangoDBClient\Handler - + includeOptionsInBody \ArangoDBClient\Handler::includeOptionsInBody() - + Helper function that runs through the options given and includes them into the parameters array given. Only options that are set in $includeArray will be included. This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - + array - + array - + array - + array @@ -18119,19 +18563,19 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\Handler - + makeCollection \ArangoDBClient\Handler::makeCollection() - + Turn a value into a collection name - + \ArangoDBClient\ClientException - + mixed - + string @@ -18142,6 +18586,31 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\Handler + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + + array + + + mixed + + + + $headers + + array + + + $collection + + mixed + + \ArangoDBClient\Handler + setDocumentClass \ArangoDBClient\DocumentClassable::setDocumentClass() @@ -18188,1622 +18657,2030 @@ This is only for options that are to be sent to the ArangoDB server in a json bo eJzFVN9v2jAQfs9fcQ+VCAjENmkv6dZ1o6io6wOl8DCNqTLJkVg1dnZ2RlHV/31nE7IKrZU6ps1SlDj33a/v7O/dh7Ioo6jf6UTQgY8kdG7OPsF4NIZUSdQuge8V0gYKoTMldc4wjzwtRXorcgRonAYBH4yicoUhtsGF0HDtEFdC62BKTbkhmRcOBs3Xm1ev33bBkeSA2sL5ajHqslmZXGMXzpHYe8Pe/SjSYoWWc+Ne2uMoSpWwFq58tSNfLBLgnUOdWaj30X3kawrN+tWBgUJBFlyBoKR1YJZglVmHniXaGrZDn7qCzNrC8C7F0kmja0M/vMtqoWQKy0qn3sb8cexrjha3g32b3K+jihS8hxmpEaoSKUkWlVQZ72N+bJLMJpc3V7Ph5EsXvrZ8Qa1v7eNf7q6QtneSoxsYrTFki9u9kwwVOox99Br9EO03PEFXkT6448ZOIR4IIrF5lg2u9mkuwjqAEOIzYbRFjvEUOfxjx0zjVxffuAfUhfUOL+EvrYj4CKoNnzdMK8e35F/QOdim/RuM1h38L1I/S6UsCLAlpnLJbQbJ2eNmyiXAmpFg+U4D68poOh3D2fByOB1CalYsEhk4E0ZjkX7w/fc7Vg+phcPt/20GzH6bgkWNxAosKxGP8Ehm0KvVT2Z/OMmFMerZQd5yRzGnOkgj2P/lArE/MUcVNhN6qPX0RigpbPxYVZMkWLrQmu8ke16L8WL+GNjiJD8BgT/eng== - + - ArangoDB PHP client: server exception + ArangoDB PHP client: document handler + - - \ArangoDBClient\Exception - ServerException - \ArangoDBClient\ServerException - - Server-Exception - This exception type will be thrown by the client when the server returns an -error in response to a client request. + + \ArangoDBClient\Handler + DocumentHandler + \ArangoDBClient\DocumentHandler + + A handler that manages documents + A document handler that fetches documents from the server and +persists them on the server. It does so by issuing the +appropriate HTTP requests to the server.<br> -The exception code is the HTTP status code as returned by -the server. -In case the server provides additional details -about the error, these details can be queried using the -getDetails() function.<br> <br> - - - + + + - - ENTRY_CODE - \ArangoDBClient\ServerException::ENTRY_CODE - 'errorNum' - - Error number index + + ENTRY_DOCUMENTS + \ArangoDBClient\DocumentHandler::ENTRY_DOCUMENTS + 'documents' + + documents array index - - ENTRY_MESSAGE - \ArangoDBClient\ServerException::ENTRY_MESSAGE - 'errorMessage' - - Error message index + + OPTION_COLLECTION + \ArangoDBClient\DocumentHandler::OPTION_COLLECTION + 'collection' + + collection parameter - - $_details - \ArangoDBClient\ServerException::_details - array() - - Optional details for the exception + + OPTION_EXAMPLE + \ArangoDBClient\DocumentHandler::OPTION_EXAMPLE + 'example' + + example parameter - - array + + + + OPTION_OVERWRITE + \ArangoDBClient\DocumentHandler::OPTION_OVERWRITE + 'overwrite' + + overwrite option + + + + + OPTION_RETURN_OLD + \ArangoDBClient\DocumentHandler::OPTION_RETURN_OLD + 'returnOld' + + option for returning the old document + + + + + OPTION_RETURN_NEW + \ArangoDBClient\DocumentHandler::OPTION_RETURN_NEW + 'returnNew' + + option for returning the new document + + + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object + + + \ArangoDBClient\Connection - - $enableLogging - \ArangoDBClient\Exception::enableLogging - false - + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + string + - - __toString - \ArangoDBClient\ServerException::__toString() - - Return a string representation of the exception + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + - + string - - - setDetails - \ArangoDBClient\ServerException::setDetails() - - Set exception details - If the server provides additional details about the error -that occurred, they will be put here. - + + + get + \ArangoDBClient\DocumentHandler::get() + + Get a single document from a collection + Alias method for getById() + + \ArangoDBClient\Exception + + + string + + + mixed + + array - - void + + \ArangoDBClient\Document - $details + $collection + + string + + + $documentId + mixed + + + $options + array() array - - getDetails - \ArangoDBClient\ServerException::getDetails() - - Get exception details - If the server has provided additional details about the error -that occurred, they can be queries using the method - - array - - - - - getServerCode - \ArangoDBClient\ServerException::getServerCode() - - Get server error code - If the server has provided additional details about the error -that occurred, this will return the server error code - - integer + + has + \ArangoDBClient\DocumentHandler::has() + + Check if a document exists + This will call self::get() internally and checks if there +was an exception thrown which represents an 404 request. + + \ArangoDBClient\Exception - - - - getServerMessage - \ArangoDBClient\ServerException::getServerMessage() - - Get server error message - If the server has provided additional details about the error -that occurred, this will return the server error string - + string + + mixed + + + boolean + + + $collection + + string + + + $documentId + + mixed + - - __construct - \ArangoDBClient\Exception::__construct() - - Exception constructor. - - + + getById + \ArangoDBClient\DocumentHandler::getById() + + Get a single document from a collection + This will throw if the document cannot be fetched from the server. + + \ArangoDBClient\Exception + + string - - integer + + mixed - - \Exception + + array + + + \ArangoDBClient\Document - $message - '' + $collection + string - $code - 0 - integer + $documentId + + mixed - $previous - null - \Exception + $options + array() + array - \ArangoDBClient\Exception - - - enableLogging - \ArangoDBClient\Exception::enableLogging() - - Turn on exception logging - - - \ArangoDBClient\Exception - - - disableLogging - \ArangoDBClient\Exception::disableLogging() - - Turn off exception logging - - - \ArangoDBClient\Exception - - eJzNVk1v2kAQvfMr5hAJiICkOZI0bUoQadV8KOZSJZG12ANe1azd3TUJqvrfO7teG+MASVOpKhcb78yb2ffejn3yIY3SRuNgf78B+3AmmZgl55/g5uIGgpij0H1QKBcoAZ8CTDVPBAWa2I8pC76zGQKUaQObYRdZpqNE0hp8YQI8jThnQtilIEmXks8iDYPy7ujw3VEHtOQEKBSM5pOLDi3HyUxgB0YoKXtJ2QeNhmBzVFQba2WPy114tuHusNbwOOJqtQvQyxThkccxTBB0JJNHAZMl3aHbOTxGKOx/x4BEnUnqjtl9oJS0QS7osUoToQgkAVbkSvyRodK9sjZWSgdJiEDNGOyL8fgGlGY6U/lzplwhDKkfk7xqwcDBZwJgptyqs1QmCx4itRaG3JRgMYSoGY+VyWCTJNM23jbdMbcE4CIITRgOqGHJqWimuJiZEJM6Q32eh7XaMM1EYNB7JxN5albddc0OG8xAgIHxyWHvyGoYxEwpJ1OpEvGjUYQKVrr9bBgDWVXNbx+u0/XNwZQk0FVuXWSRQF1JNgcmJVu6Zwf2mkq+YBphzy+g3sPdA3moVnFoVRbZfIJG7BCf1mACEl7D8Gp8+80fXJ8PCaVpOb7K5s1taORfZZjaDXc59Lyz0QrxMs/agHpr7ULeU3SASDqJKXmSyGeW12S6m6LcbUVydzPKOnnZJOZBaQfwfZ14NqvVtgG5cObnwH1/8PXM83wfetDsQ5Mue5rOY/eUDJYbYUDmJ4/Rem3ZbbzVPraov57t30NdOVyl79d2+Xn6yvNSPywFgI6YhiQIMikxtCdoWU6PlBIilNjb4T7YKwp03QPS5aWuC20WCQ93KqBWx3S9Wl0PR2vF9UXkNnZHf8xuRCPMMRz+JcNro0mtRhOdIXq/hFvoyimo8Lze9WYKq5Nus4lr3O0irHhn2vNuxvo/IYxeKdaSrt9Kha2NFJRxemd1t0ZvZax6dGuk8Sm0uCJjtmq83SmMp/3+amg+tNuVvO2EP088LrOcDM+Tqcm8vVfL5cbzf6FYPotfnNjb239BuXK2vkk894p6k35F7i4JRRbHhWy0aj8bfBZzplq1j4d+3y52oHlffETeuw+RyX0ttklW+A1ZRFRS - - - - ArangoDB PHP client: base handler - - - - - - - - Handler - \ArangoDBClient\Handler - - A base class for REST-based handlers - - - - - - $_connection - \ArangoDBClient\Handler::_connection - - - Connection object - - - \ArangoDBClient\Connection + + getHead + \ArangoDBClient\DocumentHandler::getHead() + + Gets information about a single documents from a collection + This will throw if the document cannot be fetched from the server + + \ArangoDBClient\Exception - - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - - - + string - - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - - - + + mixed + + + boolean + + string - - - - __construct - \ArangoDBClient\Handler::__construct() - - Construct a new handler - - - \ArangoDBClient\Connection + + array - $connection + $collection - \ArangoDBClient\Connection + string + + + $documentId + + mixed + + + $revision + null + string + + + $ifMatch + null + boolean - - getConnection - \ArangoDBClient\Handler::getConnection() - - Return the connection object + + createFromArrayWithContext + \ArangoDBClient\DocumentHandler::createFromArrayWithContext() + + Intermediate function to call the createFromArray function from the right context - - \ArangoDBClient\Connection - - - - - getConnectionOption - \ArangoDBClient\Handler::getConnectionOption() - - Return a connection option -This is a convenience function that calls json_encode_wrapper on the connection - - - - mixed + + + + \ArangoDBClient\Document - + \ArangoDBClient\ClientException - $optionName + $data + + + + + $options - - json_encode_wrapper - \ArangoDBClient\Handler::json_encode_wrapper() - - Return a json encoded string for the array passed. - This is a convenience function that calls json_encode_wrapper on the connection - - array + + store + \ArangoDBClient\DocumentHandler::store() + + Store a document to a collection + This is an alias/shortcut to save() and replace(). Instead of having to determine which of the 3 functions to use, +simply pass the document to store() and it will figure out which one to call. + +This will throw if the document cannot be saved or replaced. + + \ArangoDBClient\Exception - - string + + \ArangoDBClient\Document - - \ArangoDBClient\ClientException + + mixed + + + array + + mixed + + - $body + $document + \ArangoDBClient\Document + + + $collection + null + mixed + + + $options + array() array - - includeOptionsInBody - \ArangoDBClient\Handler::includeOptionsInBody() - - Helper function that runs through the options given and includes them into the parameters array given. - Only options that are set in $includeArray will be included. -This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - - array + + insert + \ArangoDBClient\DocumentHandler::insert() + + insert a document into a collection + This will add the document to the collection and return the document's id + +This will throw if the document cannot be saved + + \ArangoDBClient\Exception - - array + + mixed - + + \ArangoDBClient\Document array - + array + + mixed + + - $options + $collection - array + mixed - $body + $document + \ArangoDBClient\Document|array + + + $options + array() array + + + save + \ArangoDBClient\DocumentHandler::save() + + Insert a document into a collection + This is an alias for insert(). + + + $collection + + + - $includeArray + $document + + + + + $options array() array - - makeCollection - \ArangoDBClient\Handler::makeCollection() - - Turn a value into a collection name - - - \ArangoDBClient\ClientException + + update + \ArangoDBClient\DocumentHandler::update() + + Update an existing document in a collection, identified by the including _id and optionally _rev in the patch document. + Attention - The behavior of this method has changed since version 1.1 + +This will update the document on the server + +This will throw if the document cannot be updated + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the document to-be-replaced is the same as the one given. + + \ArangoDBClient\Exception - - mixed + + \ArangoDBClient\Document - - string + + array + + + boolean - $value + $document - mixed + \ArangoDBClient\Document + + + $options + array() + array - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use - - + + updateById + \ArangoDBClient\DocumentHandler::updateById() + + Update an existing document in a collection, identified by collection id and document id +Attention - The behavior of this method has changed since version 1.1 + This will update the document on the server + +This will throw if the document cannot be updated + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the document to-be-updated is the same as the one given. + + \ArangoDBClient\Exception + + string - - \ArangoDBClient\DocumentClassable + + mixed + + + \ArangoDBClient\Document + + + array + + + boolean - $class + $collection string - \ArangoDBClient\DocumentClassable + + $documentId + + mixed + + + $document + + \ArangoDBClient\Document + + + $options + array() + array + - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use - - - string + + replace + \ArangoDBClient\DocumentHandler::replace() + + Replace an existing document in a collection, identified by the document itself + This will replace the document on the server + +This will throw if the document cannot be replaced + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the to-be-replaced document is the same as the one given. + + \ArangoDBClient\Exception - - \ArangoDBClient\DocumentClassable + + \ArangoDBClient\Document + + + array + + + boolean - $class + $document - string + \ArangoDBClient\Document + + + $options + array() + array - \ArangoDBClient\DocumentClassable - - eJztWG1v2zYQ/p5fcQOMxgkcp8tHZ8mSOl2TYUiMxv0wNIVBS7TFmiIFkopjDPnvO75IlmQ5bouuGLAJBiyR9/Lcc6cjqV9+zZJsb+/48HAPDuFSETGXV29gdD2CiDMqzACmRFNIiIg5VShk5S4yEi3InAKUKkMn7SZJbhKpcA5+JwLuDaUpEcJNRTJbKTZPDAzLu5PXP5/0wCiGBoWGd+n0uofTXM4F7cE7qlB7hdrHe3uCpFSjb9pwe7qOwMONONEaZoji/dv78ZEdi4sYdDOIlhA0E5GN7nX/xHkmU20UiUwwfB3Y+GvPRulc2+sQbtJMKgOdSSyjPEVrQw8kF5FhUhDOzCrIHrv/HMFeVWXJlFMMp2F3KIWgzgTI6We8CxPFPMaiSFoRqznJFHskhiKsqBRAHy1OMMocoyQg6HKd85ddQWdtFY6g8mAkTKkNMa7bCKjyKWdRyQ1MLDoPoNtu/cDpedLt1TEJ00fnlajgrCp/6iSfNwJ9T02uEF5Cq2jbiVVedlgN8SXFgnFpcAyLrgxvTs3aSLcZSnCzGVEZw5YgSA1JVsk9jNEW4M+JPFKB1Y1FXQIyCcF6Jpxr+KylmOCsjOlkqUiWUQWySVB7HXS8z1t8M5GZMWr4AZt8VUB8JDyn9nXcwm7KnpAqT6xX39deqZQ0iZJLDQ/1l/XB/719imjWUvYvJ+HOqXQrEbyclUYG3UCLjd0Zs3SDpzsGrHgm5q5X2fCJUmQFGXYCGvd/aCa9585UxquQSXeLefT2gAm8tw62ZDFEcuTjC09y5px7UxbnkugQ3nfObUvoXRfNV2Z1u51GZo+NjOUAuhczxL1IyYqqA4gSGi2AzdDLDBcM6UggMGUGUqkopGRBNWhc6Wi/32+WyDXlNmP1zKocl0XLUT5PKq+IhjnDWgDs0piaiOcxtWI09Ymygi6x1OCaF7LrNMqyuhN8VRpzrggi1NSgBegEm5dOcck4t808DG6WprS2bBFv2POrAEZsIMAqtxmaqkcMF72hZmprJVe8irrL2YLC/pIw85tU9ysR7fdgf0FpdptzjvfUREjjAfRfrOkCk7uqXargxYFNJI91jWDEGwK2GOuMtnuqkeY9VTzEdMYEZmmZsCipQEAhzuUSq9mTVbDcc8ldWlV0zpQ1QHJuQkNluu8op08kzTgd1Ik6O8e1lG55VwNch10jUP+MCaiQb03b/QmzPQsT823vK1xgOVKFex+oMVW6HtcL1RWvJ6iaim0FuLUdBEHfoPWNGDl/RafWvdaMncHHTxu7jIDUzp2Wo0gOJYixNAjY1zoLijbOoePyc1AxYi9sCl3ndIJiE/rEtEE8eN+rozhoKhbK3vzZGTTXMD0Y3I3GN3e3kw+jq8vx28no7o+b4Z9tduz1IYtxOziSuP1aDQaIldnnbkB9uqHzvDESOPloEX2ymy6nuqnpUPtitbgFvrTbQG2YrFLiR3chWz+FPZ+9im7vzf/fwv+xFh72NXalDG2bs5QZ27D1gmX/wmbtNiXFVW3WX9mD/ntrwBd33Te2GtY911H+5a33RzdZB+9bmhq8etXWsOCnXU2v7vA7tzxrfNsZeFw9mbl6t4cLzsNJ0n5paZZNWPbbl/nGq+BPdIGlIyg+h/SqPrC0/CFh13miHdfWGrT9eViqFMtao7QqSWRCG4IHKqz8tVozYwWnTsWdGuxhr1tZLZ932C4+8+y2vEZxE9c9bKS4UqI4iz/3gWqCSzrR3fCZajBwg9iHH4qvbMXWbfoQZPbRzd8TMyQK - - - - ArangoDB PHP client: Traversal - - - - - - - - Traversal - \ArangoDBClient\Traversal - - Provides graph traversal - A Traversal object is used to execute a graph traversal on the server side.<br> -<br> + + replaceById + \ArangoDBClient\DocumentHandler::replaceById() + + Replace an existing document in a collection, identified by collection id and document id + This will update the document on the server -The object requires the connection object, the startVertex, the edgeCollection and the optional parameters.<br> -<br> - - - - - - OPTION_FIELDS - \ArangoDBClient\Traversal::OPTION_FIELDS - 'fields' - - count fields - - - - - ENTRY_STARTVERTEX - \ArangoDBClient\Traversal::ENTRY_STARTVERTEX - 'startVertex' - - Collections index - - - - - ENTRY_EDGECOLLECTION - \ArangoDBClient\Traversal::ENTRY_EDGECOLLECTION - 'edgeCollection' - - Action index - - - - - $_connection - \ArangoDBClient\Traversal::_connection - - - The connection object - - - \ArangoDBClient\Connection - - - - - $attributes - \ArangoDBClient\Traversal::attributes - array() - - The traversal's attributes. - - - array +This will throw if the document cannot be Replaced + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the to-be-replaced document is the same as the one given. + + \ArangoDBClient\Exception - - - - $_action - \ArangoDBClient\Traversal::_action - - - - - - - - - __construct - \ArangoDBClient\Traversal::__construct() - - Initialise the Traversal object - - - \ArangoDBClient\Connection + + mixed - - string + + mixed - - string + + \ArangoDBClient\Document - + array - - \ArangoDBClient\ClientException + + boolean - $connection + $collection - \ArangoDBClient\Connection + mixed - $startVertex + $documentId - string + mixed - $edgeCollection + $document - string + \ArangoDBClient\Document $options - null + array() array - - getResult - \ArangoDBClient\Traversal::getResult() - - Execute and get the traversal result + + remove + \ArangoDBClient\DocumentHandler::remove() + + Remove a document from a collection, identified by the document itself - - array - - + \ArangoDBClient\Exception - - \ArangoDBClient\ClientException + + \ArangoDBClient\Document + + + array + + + boolean + + $document + + \ArangoDBClient\Document + + + $options + array() + array + - - getConnection - \ArangoDBClient\Traversal::getConnection() - - Return the connection object + + removeById + \ArangoDBClient\DocumentHandler::removeById() + + Remove a document from a collection, identified by the collection id and document id - - \ArangoDBClient\Connection + + \ArangoDBClient\Exception - - - - setStartVertex - \ArangoDBClient\Traversal::setStartVertex() - - Set name of the user function. It must have at least one namespace, but also can have sub-namespaces. - correct: -'myNamespace:myFunction' -'myRootNamespace:mySubNamespace:myFunction' - -wrong: -'myFunction' - - string + + mixed - - \ArangoDBClient\ClientException + + mixed + + + mixed + + + array + + + boolean - $value + $collection - string + mixed + + + $documentId + + mixed + + + $revision + null + mixed + + + $options + array() + array - - getStartVertex - \ArangoDBClient\Traversal::getStartVertex() - - Get name value + + getDocumentId + \ArangoDBClient\DocumentHandler::getDocumentId() + + Helper function to get a document id from a document or a document id value - - string + + \ArangoDBClient\ClientException - - - - setEdgeCollection - \ArangoDBClient\Traversal::setEdgeCollection() - - Set user function code - - - string + + mixed - - \ArangoDBClient\ClientException + + mixed - $value + $document - string + mixed - - getEdgeCollection - \ArangoDBClient\Traversal::getEdgeCollection() - - Get user function code + + getRevision + \ArangoDBClient\DocumentHandler::getRevision() + + Helper function to get a document id from a document or a document id value - - string + + \ArangoDBClient\ClientException + + + mixed + + + mixed + + $document + + mixed + - - set - \ArangoDBClient\Traversal::set() - - Set an attribute + + lazyCreateCollection + \ArangoDBClient\DocumentHandler::lazyCreateCollection() + + - - - - \ArangoDBClient\ClientException + + mixed + + + array - $key + $collection - + mixed - $value + $options - + array - - __set - \ArangoDBClient\Traversal::__set() - - Set an attribute, magic method - This is a magic method that allows the object to be used without -declaring all attributes first. - + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler + + + \ArangoDBClient\Connection + + + + $connection + + \ArangoDBClient\Connection + + \ArangoDBClient\Handler + + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object + + + \ArangoDBClient\Connection + + + \ArangoDBClient\Handler + + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() + + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection + + + + mixed + + \ArangoDBClient\ClientException - + + + $optionName + + + + \ArangoDBClient\Handler + + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + + array + + string - - mixed + + \ArangoDBClient\ClientException - - - void + + + $body + + array + + \ArangoDBClient\Handler + + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + + Helper function that runs through the options given and includes them into the parameters array given. + Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . + + array + + + array + + + array + + + array - $key + $options - string + array - $value + $body - mixed + array + + + $includeArray + array() + array + \ArangoDBClient\Handler - - get - \ArangoDBClient\Traversal::get() - - Get an attribute + + makeCollection + \ArangoDBClient\Handler::makeCollection() + + Turn a value into a collection name - - - string + + \ArangoDBClient\ClientException - + mixed + + string + - $key + $value - string + mixed + \ArangoDBClient\Handler - - __get - \ArangoDBClient\Traversal::__get() - - Get an attribute, magic method - This function is mapped to get() internally. - - - string + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + + array - + mixed + + $headers + + array + - $key + $collection - string + mixed + \ArangoDBClient\Handler - - __isset - \ArangoDBClient\Traversal::__isset() - - Is triggered by calling isset() or empty() on inaccessible properties. + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use - + string - - boolean + + \ArangoDBClient\DocumentClassable - $key + $class string + \ArangoDBClient\DocumentClassable - - __toString - \ArangoDBClient\Traversal::__toString() - - Returns the action string + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use - - + string + + \ArangoDBClient\DocumentClassable + + + $class + + string + + \ArangoDBClient\DocumentClassable - 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 + + Name of argument $revision does not match with the DocBlock's name $ifMatch in getHead() + The type hint of the argument is incorrect for the type definition of the @param tag with argument $revision in getHead() + Name of argument $ifMatch does not match with the DocBlock's name $revision in getHead() + The type hint of the argument is incorrect for the type definition of the @param tag with argument $ifMatch in getHead() + Argument $collection is missing from the Docblock of save + Argument $document is missing from the Docblock of save + Argument $options is missing from the Docblock of save + No summary for method lazyCreateCollection() + + eJztXW1T40YS/s6vmEtRZ5MykE3uEwl7S8AJzhGgWPb2UoSiZGmMFWTJkWRY7pL/ft09L5oZSbZkDMtucKU2xprpeeu3ebpn9N0/p+Pp2tr2l1+usS/ZXurF18nB9+z08JT5UcjjfIcFiT+bwDc29uIg4ikUxLJvpp5/411zxnS1fapBD71ZPk5SeMZ+8mL2Nud84sWx8+gHqHfDfvbuiSh74yfT+zS8HudsX3/7+qtXX/dYnobQVJyxHyfDwx48jpLrmPfYjzwFuvdQe3ttLfYmPINecadD364VA1SDYPnYyxnUBbKZHmImx7ZXGrQoP+K5PzbLs1GaTOAZZxlPb6EYlEYCU55mYQbP4dGEJbFRZIsNciAAVLKEDe9ZmGWzML7GEljTm07TZArDzTk7PD8/ZSn/fcaJVGJS+W6Yvpa9Nb7OX5QsjH18xNhXW1/TnPmRl2XsQA7nUI6Vf8h5HGRM/r32vzWsQ1OIny+N8Xtp6sEY4oB/kA+36f9+Emc56x+fn/1ydXCy/+5n+PqW7bKOrtqBZXHI+kkUcT8PYb6mXgqrmSNjlKienJ4PTo6v9k+Ojvr7+BXpFnUrCPMP3mQa8SZU+//Z+/n0qI8kZS2gh6Vcmgmswl0awjIlU+pyPc2Tf/fP3p8NzomqrldHV1AbgYikPJ+lsWQOlkSBnvj6ts765+/OoMmjA2xMUDiJgraNxfyueWPH/fdFY8f8DlfAbelHnjOPAQdewzpo6SLx8YyFl8VVrb0o9DIGSzZOAurlNc+/vx8E3Q2n4Jt8nCZ3Get/8Pm0gtAbWnqWgSKBEa4bnMY2Tb4LAwYNeqogtBjPJkPNMIrOJPzAA8bW1UAGAdLRwwoD+DcchaV6QlzYupj3jB5uylXwop58nozkT5mqPufz3fT1iaTmpZztNKkSha87V6AMolnABzHIAzSedaAneTrjqGjkM2KFUBZgXg6TMpzlPNtiB3zkzSKhlUZQmX+3DUSbt30dJyk/DAOYqD1N1uxBNk7u2JgKrLDhlN+GGeoIbGnMDUWmnrQiF45+9sAiILVhkkQcTF04YtfhLXRaEcSRzEB0J1iSGCrJGzeyPX3tMrKQMq2znYFIExW4hsmS4elsGIU+G81iwfQgVF1DJHomXyue1Cy7yy4uhfQJs4Af2af1fBxmm6+VjNaTVMQ2hFb6s6wu9sfcv8HJ9Iqh8Q9oUp35OIcm2V0YRcz34J+MR6OdHRzQhmbc6B7NMvORZIY0YVpSrgjcobzHQFwqDkaaJGZ34xDWK+XTlGfC1MXsH1/9Q9njrUUKiL0fI+vGIM7YHuNpmpAbAT8SocT3Z6k7nHo9tSI1NU9LuTwmeXou74y9rHahXTbJ03vjL1rxbbF2NHnsLbFqMYOwVEAHKvkkQSA4bMiR2dKQ3/LAolTwXn13pGPgcC1qnG/1gz+Bj1BQu25n1vlGRec5KV3+YYrtwUqIpQXdZE+hUFVWbRhcd51Tj/eTgAO/7u7uYm23GaOrROVb6+mfa26ffpuBgYYKOKXWMzHJ6+Zg1+rkbzlzXQijaEvIWlHfhz2AWMQaNbVQql7M+pwqf1mz/uh22PUdzk2uDjMpn8A70GyYizZ4to3MLr/rfmw9P+O/wFo3cABQmYFsTRMwBmbVznZng/0N9BqtqavZ3kRg0M2GWc9U19ASKNYIlSPQcVW5IvKn/rYeeLlnz+GuYRfUpHXfpVG2s/Pu7EjvTHussa9CDcmfLoDjM9zvXLJdpZtrfCI/5bCj/wHWZQ9n832Yj/cTkMAPMH7sdhOfqFond7Ugi22SuzMinSx3UCEBEuwuSW/GSZpxe0sFKoFhbzXmgV4TlucBgiQa/rFZsp2GnqWRXpxNg0U3M1CuDNYEjAMWRGdOWfgXNW9XeVHzn7uaV4tWo/4Fny2j+9MkB1HBUob614oRpXOeKmxgCNbH3At4mqm/sYyhOIUy9ILgPPXizKNGDqlGV9W0OmC67JbYM0O3T7wbvq+fdeuqm6qHqoMdOOTRlKc7O8NZGAXwt5yCi7o5uDSsANo8mpGrG35/JTanXc2jhkJnf/87KxfUfGaUdA0k7RG0sVGkL2mngKJWtVVQ83jRGYw2dQXW+aLDtgzLpZu/hJ/hobOrYByEcxH14yTmyzfh7kKIPGy2p1CZW5YbLGUsF3dDbvEEp8rOmMtMU6aoUOHDPJ8aO6xvyjsssVlByFOA5dqWdTva04J9Lm1AfTCD1zzY6myUtlH4UVbf6sFPGfZ8nl3PQE+DLQYlgtztDZNZhanPHn//ZdNbzsa3Ry22HELSPi/GLdyKyiqsS1HBh5usnbFwaepR6UrsgZZhgVb31FcfHEQv1JC8n2A0IudMcL208uopqBY2lpyuWqh1+FHlzoPn9FB3YYUilDQ1oeKH+fgf9q+tk61aLJqa7weDQ+ttkr+PLuzjeMU0S0/hFVu2aVmveFVgYWO0sFTPEhDlFRcE1ONHlNkHOVCapRa5TMTfi3yl1jL0F/OcivlBeAAnBN0kPUfqx0qPSGmI1t6PbnPFLs9cuhVIRYW/Y81vnetjcl7h+7gdZQ4x2xsSZboV9S46yoDQ2Oq8qAqMQxKo1di0S53wgLIatBzBHpBiNmTcbHykKKQdFJEO4gvQpFqdrhvSq3+z9+J1SJqruH+10yd+dRzDRSqiBdzjqoErJTP7lJuhmcH+vWIR7AI7O04fmuNMb3PY3ZuBN1ioRU5nSPExD8P126Cg09yfUb3Mu0XHG21myqeR58NfW8APWQ4sg1DJ2LslFyZhASZmTMKYy9BbIpzXb/SsEmowy3hPtZyF4BHdsynOk6XKsWEchGwZHDJyikfh9QxGhs61bCLmigtdE9LclcYhBowyKGiAwZJBDL3V0FpTLvBmaXDQKlgCDmYGuoF/4RRwaeZ1QXSMpK2rMdkly1DhNyzwGiQm5qBi7MHAGH1cdExkOjWsi2COkIHCxCGoI36TLnUxWPLbKS8L1/Wey3hzYxynaPTOC/MfkvTtfexje0g647RuuGfvYcsoKhEwzCS5BRcpAUvqiWESx4UgHl6cA2sjewEZ4J84xAVGMQmzG7bNBiPhlYaiv9mU++icBZK8PbpOBtJFyBuRA7IodrCk1Bxy03QKCi5oOdj6AIVgsE1kIVj1Qmho6gsHViSkvdr6au6GRYhyWTwsf0e7WQ2jFZoKWbcBwvhdwl/K7obZSI1bgp85KMKeI1a0Yfx9FqZiSTOpcM2kKwtgwI8T6EXrjOup7QNp2mrvqzKIQUSKScjUJIhITXWoXDZaiXw4U9UCY9mLhaihmqnSrzg7AQLZiZwjg7HnozBiZpThqZ+PCiMIMsjT3FSnsgMNwBfQzSWV7agbYRBF/oFREgQ1DGrpNrJEyxkfbREkY8zfSy6wCUpU/5CyaNiz1dsybYBkzw0ztAoT9DAj9JHM0F/MEMnhFpm1VYMVEqQEToq3lGmpIYrxO5lnd+C/C1hGjY7wNi+CNQzuZWLaUn0ucmZrF0im48IiSPNp9kvMmkIfH9AFzBGe2wXl3da3DtXBOx/NgI9i6O0d1pxlpCh0rrSIW7Tu5xN5GoIraq1om/jXR4dvdO3WG8p1UqxGSRlPllpwEJ/S867tSshZ6bGLkmdkKyIxhtfCXSuXzcIIDaHxE5Qlp6SisCHyReEuYocb7I2ORImkUDcZ/7KCniELTekVCff1BEm+WxI87r93CF7qv9yAVzcEk5kbocKSwbmkKOT8An/8Ya9offxNcEK3+F2yhh7D/ll/77xfimdKkpH33/t9pwOO0AkWrPbuCI+0QEiwGjwOBFsiFlkOPiAyt01YXXUz1nSG2ZUnIRMpIuWRUOxht9AOZgZpBZBYKk/zuBdFIBYD0jrvplCEd2uG3CAuOk0yHRgVRX7LkviKx34S8Ku7FCcpFSjQRjV+iOUFj9YEMHXR7W0ZQQENBO4goip0QApm744D02PQZEhA7gQa72kEBj2E6wQUbko50SItO7nh6oiUzNEe8ii52zJb2/dmOM4dEzoyDPTgoKdyce1zLNQJWGXwIIe/wVzZI+BsECic6XsseYolpR+q84zxlBZCREgT94oYFEJjkVs9fE/jHnpZ6FPKedEPICcaZ5h33sO5SVKM4OFsoP/h+xRcoWpgQYuOM+q58LktvzkMLIZdH+rOu0unh9Ut8bDaJenKVUl16mO1t1gVgjJpoN/qeoSMWLvJbCCdJp2LEjAqTqX9q//LZbWsRYnvSUjBnssj+UAabiei8TddsU1+QSjy2kchiIJuWEd41bFC1Y2a/e46ULEUopHVMwgQAlZd7xadNC2+jQPI4Nm/OMzxoik09UclFUwtnUdkcFBP40zGVeZTOOv/+7KUAgIzgjEkB+YJylIwZ3F+hIXBEGQMe6Mw0IvgJk3ULUoTcEVxaqmbCpjAf11sYtAYm1CHEksgPcW4pbu7MT9fYC6wVOUSM8cnttGYBT52GZlxBi/spDiy44JGYWxNQq8IWpMSFxs/lTVxhXoVpE5hBKB8r1J+K+L9CEOgAtZwnGp+L8+RJOEiaED0DjaR+2CZVID5QjJXiInNxy2eCYZ6r7Ze1SI8MzE4S9dbp4eXxoYEZRcdgs37NIHVxmPIat8nDip1UU/gnGAuRJQM6Ts2MrsWW+GS86dSLHSChARyjKPUCOnQHINAzXBIeU/0F3wSsJxcHuRCJ0ARI7dC7D9ljDVxxpgnm0O+qbenMpsj8yZcmU0M81ASweoiM2LxbR4Rfa1dR+ArOjlWToGoiKE8DLpqn1VMSIBgBYQBZP8lbwiUbpYRCgs8BQsFvfGTeASPc9btEMt0eqwDahm2bsAyx++OjtgFOjMS77ncaLjnp57ccD49hv0hAWXCHZtJ2AkxqXQGzerLCih2SJlRWiMUOcdUHh1GYLZceoVhKhiQAoq4DbUTkymJuYtdMOkQnCFFhEIAbcbjIHHOkEAX+ya+JpwAl8/lmhQYlcLgOKbHqIXR8mI0yUaRdw3iB0qQQ1Go5A0jLg5UUyYTKLTUhOmaDq0elsEdLuayRXfefWYhcIaewn2COHyJ/DPXCInBVwaBWp9PFbTEoRfL7ha7UbTAvYqzI2aVjQV2a4WGywHg46C8E3ixTM/VMsnxPYZhUql/DkTYPmJTJASYZ2Ls9L8WgR8nhWHTNZQi+0Lmt4qpMDQtrlKhn0scsiDz4OFBnyXO5LDnZEF1bz4jK6rH9HlaUhreU1vTBcc+V2JrSfDbJoM/klVdmBTeWutaibGbyyRtv2juF81d0ZsXzf2pa+4FJxAerNHLOcdC1S46l7CkVn+Jay+Ma+++rgzNLYyVvt8bnF+9/eV4f6MiflwoAkahY+KUcjEraD4nXi5Obp/x26wzj5xShorcUuN6d3qwd96/Oj05Guz/UjU2K9i+yjj7qkLsVkRBhtgFD100HDaF3W1+akmAUk6Fk3NKq7Kz0z87OzkrOurmrJonj2x8Q4dTnDRQHB6dwKGIiapeebxG9t5kJOPyi1JxfbIkHG1O5KmZVRybKWUALHMMaXEegVSmpWSEgoSbhVuOyptaeV5YflFewPyY/a7qSunAMZVaPqpWGvJHjf+Wruyq2BGcyWS+ZSNERdkc+12La6mkwUeAxFQw4/PBxJwgjXl0+kmiNU7GsTPBzzcQo5jso0ViPk+v/QmxFnX6YCVwiiRmxy5WHah4iAJtEql4yuDC2YsmXV6T1hwTfH4glaPdX1Cn5VCnVeh6yZhChJ+PwqcxPrnSfxKEfdb6RsPHMgaPDrAveTPKi/6aLxcv+uvT0F9PcQciY49wDeIzAchni684fIHHPyl4/Dni3mf906O9/U8a+Fbf2+De9rCXAb4dCo2Qb7MFG8auuIby8RHtJe6+VN8MsLb5UTEby2YruJurklBTXLwBHD5bzRm1F7zb8NAnya11X1PpmtD2MPdKsVbs3/OHWj92zvtqvFfnIoeP77k+6a4bOW1VSCvSag+06gKF1jEfN9hvLyXNbXDXVuif44Uuu3e2N86td86SiHHDKLMuGZ2Tgo1CJNKjqlWQc2/ZQ7fTy2ymn48i+rxV0UdQRotehFa6Jba1ooLZzfgDrltehUZaMfC3GthvRaDfwyA/RcTSXKtRXCvGAV8U16emuJ4eQRO6pv3V188AQWt75/ULGLYSMOygf9R/iiTQh+NXVk+Xga9sAu3zNp97FqYNET2H7Mtm0Ezp6qaFIJWwuvUXrRMVAqLmw1D4WQjxLNuJJtCQmFnrxvVrbl8cEihvrki8SZ0ClLRS49BV34s+fwvoOFEnZ/Pjn65dUzf+GTTaGrbw1rqIvm4775oowxOsvPnLuldYXp7pc/AvFPXyLWKVFJ1LYByGobuG8BakEF/ZVVDAC9xgzFfCI616MooSr1wFik/sH1F1dTptbsrZFwlXXpTz1L04U7zLyFitBZf2Fj154esH83UFCuVyteOtuRcpteLnVkcPKl+bJYrVrvwcbMr4I8YkOLzgqAnk85He4OjewHh+P6WLa79Q8/YFjuBr2jsUiY2tdw7YVu3DL/AdRtTON9QO/rlkGxV3fOKtrJ/fjcPGTqx2n9Tggsu6138UhQ7l+6Z2hcp1f+9WOw7VmxjcUlliXX4fYSU/znk3oXZCcyxIL4ypvV2UaFXftlfdGZOZmvTBLG93xXpS2YPKt9J7ec4nU+Lcyou67W6UFk298HfhrabqbfML3jNv6LYJKChgYXnYFy9KF7dQG0OTA4T/fIxwXtGNbzosIru4s0MPe6zzK3gA3jWPM/XSm+GvTlm02P8HXsDLdQ== - + - ArangoDB PHP client: vertex document handler + ArangoDB PHP client: statement - - - - \ArangoDBClient\DocumentHandler - VertexHandler - \ArangoDBClient\VertexHandler - - A handler that manages vertices. - A vertex-document handler that fetches vertices from the server and -persists them on the server. It does so by issuing the -appropriate HTTP requests to the server. - - - + + + Statement + \ArangoDBClient\Statement + + Container for an AQL query + Optional bind parameters can be used when issuing the AQL query to separate +the query from the values. +Executing a query will result in a cursor being created. + +There is an important distinction between two different types of statements: +<ul> +<li> statements that produce an array of documents as their result AND<br /> +<li> statements that do not produce documents +</ul> + +For example, a statement such as "FOR e IN example RETURN e" will produce +an array of documents as its result. The result can be treated as an array of +documents, and each document can be updated and sent back to the server by +the client.<br /> +<br /> +However, the query "RETURN 1 + 1" will not produce an array of documents as +its result, but an array with a single scalar value (the number 2). +"2" is not a valid document so creating a document from it will fail.<br /> +<br /> +To turn the results of this query into a document, the following needs to +be done: +<ul> +<li> modify the query to "RETURN { value: 1 + 1 }". The result will then be a + an array of documents with a "value" attribute<br /> +<li> use the "_flat" option for the statement to indicate that you don't want + to treat the statement result as an array of documents, but as a flat array +</ul> + + - - ENTRY_DOCUMENTS - \ArangoDBClient\DocumentHandler::ENTRY_DOCUMENTS - 'documents' - - documents array index + + ENTRY_QUERY + \ArangoDBClient\Statement::ENTRY_QUERY + 'query' + + Query string index - - OPTION_COLLECTION - \ArangoDBClient\DocumentHandler::OPTION_COLLECTION - 'collection' - - collection parameter + + ENTRY_COUNT + \ArangoDBClient\Statement::ENTRY_COUNT + 'count' + + Count option index - - OPTION_EXAMPLE - \ArangoDBClient\DocumentHandler::OPTION_EXAMPLE - 'example' - - example parameter + + ENTRY_BATCHSIZE + \ArangoDBClient\Statement::ENTRY_BATCHSIZE + 'batchSize' + + Batch size index - - OPTION_OVERWRITE - \ArangoDBClient\DocumentHandler::OPTION_OVERWRITE - 'overwrite' - - overwrite option + + ENTRY_RETRIES + \ArangoDBClient\Statement::ENTRY_RETRIES + 'retries' + + Retries index - - OPTION_RETURN_OLD - \ArangoDBClient\DocumentHandler::OPTION_RETURN_OLD - 'returnOld' - - option for returning the old document + + ENTRY_BINDVARS + \ArangoDBClient\Statement::ENTRY_BINDVARS + 'bindVars' + + Bind variables index - - OPTION_RETURN_NEW - \ArangoDBClient\DocumentHandler::OPTION_RETURN_NEW - 'returnNew' - - option for returning the new document + + ENTRY_FAIL_ON_WARNING + \ArangoDBClient\Statement::ENTRY_FAIL_ON_WARNING + 'failOnWarning' + + Fail on warning flag - + + ENTRY_MEMORY_LIMIT + \ArangoDBClient\Statement::ENTRY_MEMORY_LIMIT + 'memoryLimit' + + Memory limit threshold for query + + + + + FULL_COUNT + \ArangoDBClient\Statement::FULL_COUNT + 'fullCount' + + Full count option index + + + + + ENTRY_STREAM + \ArangoDBClient\Statement::ENTRY_STREAM + 'stream' + + Stream attribute + + + + + ENTRY_TTL + \ArangoDBClient\Statement::ENTRY_TTL + 'ttl' + + TTL attribute + + + + + ENTRY_TRANSACTION + \ArangoDBClient\Statement::ENTRY_TRANSACTION + 'transaction' + + transaction attribute (used internally) + + + + $_connection - \ArangoDBClient\Handler::_connection + \ArangoDBClient\Statement::_connection - - Connection object + + The connection object - + \ArangoDBClient\Connection - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - + + $_bindVars + \ArangoDBClient\Statement::_bindVars + + + The bind variables and values used for the statement - - string + + \ArangoDBClient\BindVars - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - + + $_batchSize + \ArangoDBClient\Statement::_batchSize + + + The current batch size (number of result documents retrieved per round-trip) - - string + + mixed - - createFromArrayWithContext - \ArangoDBClient\VertexHandler::createFromArrayWithContext() - - Intermediate function to call the createFromArray function from the right context + + $_doCount + \ArangoDBClient\Statement::_doCount + false + + The count flag (should server return total number of results) - - - - \ArangoDBClient\Document - - - \ArangoDBClient\ClientException + + boolean - - - $data - - - - - $options - - - - - - get - \ArangoDBClient\DocumentHandler::get() - - Get a single document from a collection - Alias method for getById() - - \ArangoDBClient\Exception - - - string - - - mixed - - - array - - - \ArangoDBClient\Document + + + $_fullCount + \ArangoDBClient\Statement::_fullCount + false + + The count flag (should server return total number of results ignoring the limit) +Be careful! This option also prevents ArangoDB from using some server side optimizations! + + + boolean - - $collection - - string - - - $documentId - - mixed - - - $options - array() - array - - \ArangoDBClient\DocumentHandler - - - has - \ArangoDBClient\DocumentHandler::has() - - Check if a document exists - This will call self::get() internally and checks if there -was an exception thrown which represents an 404 request. - - \ArangoDBClient\Exception - - + + + $_query + \ArangoDBClient\Statement::_query + + + The query string + + string - - mixed + + + + $_flat + \ArangoDBClient\Statement::_flat + false + + "flat" flag (if set, the query results will be treated as a simple array, not documents) + + + boolean - + + + + $_sanitize + \ArangoDBClient\Statement::_sanitize + false + + Sanitation flag (if set, the _id and _rev attributes will be removed from the results) + + boolean - - $collection - - string - - - $documentId - - mixed - - \ArangoDBClient\DocumentHandler - - - getById - \ArangoDBClient\DocumentHandler::getById() - - Get a single document from a collection - This will throw if the document cannot be fetched from the server. - - \ArangoDBClient\Exception + + + $_retries + \ArangoDBClient\Statement::_retries + 0 + + Number of retries in case a deadlock occurs + + + boolean - - string + + + + $_cache + \ArangoDBClient\Statement::_cache + + + Whether or not the query cache should be consulted + + + boolean - - mixed + + + + $_stream + \ArangoDBClient\Statement::_stream + + + Whether or not the query results should be build up dynamically and streamed to the +client application whenever available, or build up entirely on the server first and +then streamed incrementally (false) + + + boolean - - array + + + + $_ttl + \ArangoDBClient\Statement::_ttl + + + Number of seconds the cursor will be kept on the server if the statement result +is bigger than the initial batch size. The default value is a server-defined +value + + + double - - \ArangoDBClient\Document + + + + $_failOnWarning + \ArangoDBClient\Statement::_failOnWarning + false + + Whether or not the cache should abort when it encounters a warning + + + boolean - - $collection - - string - - - $documentId - - mixed - - - $options - array() - array - - \ArangoDBClient\DocumentHandler - - - getHead - \ArangoDBClient\DocumentHandler::getHead() - - Gets information about a single documents from a collection - This will throw if the document cannot be fetched from the server - - \ArangoDBClient\Exception + + + $_memoryLimit + \ArangoDBClient\Statement::_memoryLimit + 0 + + Approximate memory limit value (in bytes) that a query can use on the server-side +(a value of 0 or less will mean the memory is not limited) + + + integer - + + + + $_trxId + \ArangoDBClient\Statement::_trxId + null + + transaction id (used internally) + + string - - mixed + + + + $resultType + \ArangoDBClient\Statement::resultType + + + resultType + + + string - - boolean + + + + $_documentClass + \ArangoDBClient\Statement::_documentClass + + + + + + + + __construct + \ArangoDBClient\Statement::__construct() + + Initialise the statement + The $data property can be used to specify the query text and further +options for the query. + +An important consideration when creating a statement is whether the +statement will produce a list of documents as its result or any other +non-document value. When a statement is created, by default it is +assumed that the statement will produce documents. If this is not the +case, executing a statement that returns non-documents will fail. + +To explicitly mark the statement as returning non-documents, the '_flat' +option should be specified in $data. + + \ArangoDBClient\Exception - - string + + \ArangoDBClient\Connection - + array - $collection + $connection - string + \ArangoDBClient\Connection - $documentId + $data - mixed - - - $revision - null - string - - - $ifMatch - null - boolean + array - \ArangoDBClient\DocumentHandler - - createFromArrayWithContext - \ArangoDBClient\DocumentHandler::createFromArrayWithContext() - - Intermediate function to call the createFromArray function from the right context + + getConnection + \ArangoDBClient\Statement::getConnection() + + Return the connection object - - - - \ArangoDBClient\Document + + \ArangoDBClient\Connection - - \ArangoDBClient\ClientException + + + + execute + \ArangoDBClient\Statement::execute() + + Execute the statement + This will post the query to the server and return the results as +a Cursor. The cursor can then be used to iterate the results. + + \ArangoDBClient\Exception + + + \ArangoDBClient\Cursor - - $data - - - - - $options - - - - \ArangoDBClient\DocumentHandler - - store - \ArangoDBClient\DocumentHandler::store() - - Store a document to a collection - This is an alias/shortcut to save() and replace(). Instead of having to determine which of the 3 functions to use, -simply pass the document to store() and it will figure out which one to call. - -This will throw if the document cannot be saved or replaced. - + + explain + \ArangoDBClient\Statement::explain() + + Explain the statement's execution plan + This will post the query to the server and return the execution plan as an array. + \ArangoDBClient\Exception - - \ArangoDBClient\Document + + array - - mixed + + + + validate + \ArangoDBClient\Statement::validate() + + Validates the statement + This will post the query to the server for validation and return the validation result as an array. + + \ArangoDBClient\Exception - + array - + + + + __invoke + \ArangoDBClient\Statement::__invoke() + + Invoke the statement + This will simply call execute(). Arguments are ignored. + + \ArangoDBClient\Exception + + mixed - + + \ArangoDBClient\Cursor + - $document + $args - \ArangoDBClient\Document - - - $collection - null mixed - - $options - array() - array - - \ArangoDBClient\DocumentHandler - - save - \ArangoDBClient\DocumentHandler::save() - - save a document to a collection - This will add the document to the collection and return the document's id + + __toString + \ArangoDBClient\Statement::__toString() + + Return a string representation of the statement + + + string + + + + + bind + \ArangoDBClient\Statement::bind() + + Bind a parameter to the statement + This method can either be called with a string $key and a +separate value in $value, or with an array of all bind +bind parameters in $key, with $value being NULL. -This will throw if the document cannot be saved - +Allowed value types for bind parameters are string, int, +double, bool and array. Arrays must not contain any other +than these types. + \ArangoDBClient\Exception - + mixed - - \ArangoDBClient\Document - array - - - array - - + mixed - + + void + - $collection + $key mixed - $document - - \ArangoDBClient\Document|array - - - $options - array() - array + $value + null + mixed - \ArangoDBClient\DocumentHandler - - insert - \ArangoDBClient\DocumentHandler::insert() - - Insert a document into a collection - This is an alias for save(). + + getBindVars + \ArangoDBClient\Statement::getBindVars() + + Get all bind parameters as an array + + + array + - - $collection - - - - - $document - - - - - $options - array() - array - - \ArangoDBClient\DocumentHandler - - update - \ArangoDBClient\DocumentHandler::update() - - Update an existing document in a collection, identified by the including _id and optionally _rev in the patch document. - Attention - The behavior of this method has changed since version 1.1 - -This will update the document on the server - -This will throw if the document cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the document to-be-replaced is the same as the one given. - - \ArangoDBClient\Exception - - - \ArangoDBClient\Document + + setQuery + \ArangoDBClient\Statement::setQuery() + + Set the query string + + + \ArangoDBClient\ClientException - - array + + string - - boolean + + void - $document + $query - \ArangoDBClient\Document - - - $options - array() - array + string - \ArangoDBClient\DocumentHandler - - updateById - \ArangoDBClient\DocumentHandler::updateById() - - Update an existing document in a collection, identified by collection id and document id -Attention - The behavior of this method has changed since version 1.1 - This will update the document on the server - -This will throw if the document cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the document to-be-updated is the same as the one given. - - \ArangoDBClient\Exception - - + + getQuery + \ArangoDBClient\Statement::getQuery() + + Get the query string + + string - - mixed - - - \ArangoDBClient\Document - - - array - - - boolean + + + + setResultType + \ArangoDBClient\Statement::setResultType() + + setResultType + + + + string - $collection - - string - - - $documentId + $resultType - mixed + + + + setCount + \ArangoDBClient\Statement::setCount() + + Set the count option for the statement + + + boolean + + + void + + - $document + $value - \ArangoDBClient\Document - - - $options - array() - array + boolean - \ArangoDBClient\DocumentHandler - - replace - \ArangoDBClient\DocumentHandler::replace() - - Replace an existing document in a collection, identified by the document itself - This will update the document on the server - -This will throw if the document cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the to-be-replaced document is the same as the one given. - - \ArangoDBClient\Exception - - - \ArangoDBClient\Document - - - array + + getCount + \ArangoDBClient\Statement::getCount() + + Get the count option value of the statement + + + boolean - + + + + setFullCount + \ArangoDBClient\Statement::setFullCount() + + Set the full count option for the statement + + boolean + + void + - $document + $value - \ArangoDBClient\Document - - - $options - array() - array + boolean - \ArangoDBClient\DocumentHandler - - replaceById - \ArangoDBClient\DocumentHandler::replaceById() - - Replace an existing document in a collection, identified by collection id and document id - This will update the document on the server - -This will throw if the document cannot be Replaced - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the to-be-replaced document is the same as the one given. - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - \ArangoDBClient\Document + + getFullCount + \ArangoDBClient\Statement::getFullCount() + + Get the full count option value of the statement + + + boolean - - array + + + + setTtl + \ArangoDBClient\Statement::setTtl() + + Set the ttl option for the statement + + + double - - boolean + + void - $collection + $value - mixed + double - - $documentId - - mixed - - - $document - - \ArangoDBClient\Document - - - $options - array() - array - - \ArangoDBClient\DocumentHandler - - remove - \ArangoDBClient\DocumentHandler::remove() - - Remove a document from a collection, identified by the document itself + + getTtl + \ArangoDBClient\Statement::getTtl() + + Get the ttl option value of the statement - - \ArangoDBClient\Exception - - - \ArangoDBClient\Document - - - array + + double - + + + + setStream + \ArangoDBClient\Statement::setStream() + + Set the streaming option for the statement + + boolean + + void + - $document + $value - \ArangoDBClient\Document - - - $options - array() - array + boolean - \ArangoDBClient\DocumentHandler - - removeById - \ArangoDBClient\DocumentHandler::removeById() - - Remove a document from a collection, identified by the collection id and document id + + getStream + \ArangoDBClient\Statement::getStream() + + Get the streaming option value of the statement - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - mixed - - - array + + boolean - + + + + setCache + \ArangoDBClient\Statement::setCache() + + Set the caching option for the statement + + boolean + + void + - $collection - - mixed - - - $documentId + $value - mixed - - - $revision - null - mixed - - - $options - array() - array + boolean - \ArangoDBClient\DocumentHandler - - getDocumentId - \ArangoDBClient\DocumentHandler::getDocumentId() - - Helper function to get a document id from a document or a document id value + + getCache + \ArangoDBClient\Statement::getCache() + + Get the caching option value of the statement - - \ArangoDBClient\ClientException + + boolean - - mixed + + + + setFailOnWarning + \ArangoDBClient\Statement::setFailOnWarning() + + Set whether or not the cache should abort when it encounters a warning + + + boolean - - mixed + + void - $document - - mixed + $value + true + boolean - \ArangoDBClient\DocumentHandler - - getRevision - \ArangoDBClient\DocumentHandler::getRevision() - - Helper function to get a document id from a document or a document id value + + getFailOnWarning + \ArangoDBClient\Statement::getFailOnWarning() + + Get the configured value for fail-on-warning - - \ArangoDBClient\ClientException + + boolean - - mixed + + + + setMemoryLimit + \ArangoDBClient\Statement::setMemoryLimit() + + Set the approximate memory limit threshold to be used by the query on the server-side +(a value of 0 or less will mean the memory is not limited) + + + integer - - mixed + + void - $document + $value - mixed + integer - \ArangoDBClient\DocumentHandler - - createCollectionIfOptions - \ArangoDBClient\DocumentHandler::createCollectionIfOptions() - - + + getMemoryLimit + \ArangoDBClient\Statement::getMemoryLimit() + + Get the configured memory limit for the statement - - - array + + integer - - $collection - - - - - $options - - array - - \ArangoDBClient\DocumentHandler - - __construct - \ArangoDBClient\Handler::__construct() - - Construct a new handler - - - \ArangoDBClient\Connection + + setBatchSize + \ArangoDBClient\Statement::setBatchSize() + + Set the batch size for the statement + The batch size is the number of results to be transferred +in one server round-trip. If a query produces more results +than the batch size, it creates a server-side cursor that +provides the additional results. + +The server-side cursor can be accessed by the client with subsequent HTTP requests. + + \ArangoDBClient\ClientException + + + integer + + + void - $connection + $value - \ArangoDBClient\Connection + integer - \ArangoDBClient\Handler - - getConnection - \ArangoDBClient\Handler::getConnection() - - Return the connection object + + getBatchSize + \ArangoDBClient\Statement::getBatchSize() + + Get the batch size for the statement - - \ArangoDBClient\Connection + + integer - \ArangoDBClient\Handler - - getConnectionOption - \ArangoDBClient\Handler::getConnectionOption() - - Return a connection option -This is a convenience function that calls json_encode_wrapper on the connection + + buildData + \ArangoDBClient\Statement::buildData() + + Build an array of data to be posted to the server when issuing the statement - - - mixed - - - \ArangoDBClient\ClientException + + array - - $optionName - - - - \ArangoDBClient\Handler - - json_encode_wrapper - \ArangoDBClient\Handler::json_encode_wrapper() - - Return a json encoded string for the array passed. - This is a convenience function that calls json_encode_wrapper on the connection - + + getCursorOptions + \ArangoDBClient\Statement::getCursorOptions() + + Return an array of cursor options + + array - + + + + setDocumentClass + \ArangoDBClient\Statement::setDocumentClass() + + Sets the document class to use + + string - - \ArangoDBClient\ClientException + + \ArangoDBClient\Statement - $body + $class - array + string - \ArangoDBClient\Handler - - includeOptionsInBody - \ArangoDBClient\Handler::includeOptionsInBody() - + + + No summary for property $_documentClass + + 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 + + + + ArangoDB PHP client: exception base class + + + + + + + \Exception + Exception + \ArangoDBClient\Exception + + Exception base class used to throw Arango specific exceptions + <br> + + + + + $enableLogging + \ArangoDBClient\Exception::enableLogging + false + + + + + + + __construct + \ArangoDBClient\Exception::__construct() + + Exception constructor. + + + string + + + integer + + + \Exception + + + + $message + '' + string + + + $code + 0 + integer + + + $previous + null + \Exception + + + + enableLogging + \ArangoDBClient\Exception::enableLogging() + + Turn on exception logging + + + + + disableLogging + \ArangoDBClient\Exception::disableLogging() + + Turn off exception logging + + + + + + No summary for property $enableLogging + + eJydVF1vmzAUfedX3AckoGJJlkfaZu26qtVUaZXSx0jIOBewRmxkmy7VtP++i8NHgtJpql9sfM+599wPfPWlLmvPm19ceHABt5rJQn37Cs+Pz8ArgdImgHuOtRVKQsYM0jUzhsAt/qZm/CcrEGCg3jmWM7LGlkqTDb4zCWuLuGNSOhNX9ZsWRWnhbjgtF5+XMVgtyKE08LDLHmMyV6qQGMMDamK/EXvueZLt0FBsnIS9HDK5PyMaGoNbsApsqdWvjgqmRi5ywcc8++yuMr36r0SNkLw1ASxmS6fwEG8UgXuLcmtgM1x5v72W4OS261gyJw1WN9wqPeusPYiEaLYDMgtZuDufSmFI2gQhpIVu+Vxtp+ZRCPi1xlehGtNB5m6vm6yiouSN5A6VpoOqsA8J1xAE8cE/nRfxWbdkkU1VRc7tIet2iRxCg1WeJD5KllX4pIqCkoqOMO26Qa2VTmkMwgJt6iob+rYUJoIZBAkEtPWKosv3uMHaUgtpvGhqkmCCy5VGxksIcV9XlExI85/e/3ii3NpAn1YU+aVl3pq1q3wYRcAM+AKuV+BXQuJU9jQ8fTqhDnsa/Y83noYjtan9+5Jzde9KHo817jx2/KOhemm0BDeAfV+qQ5nPNdtYZo97ftKXcNrAc82jXpNU/LeaPP+YnK0wH9CTs8qcCqq1eGUWe//vMQjthi1llWAmHCY7Sdx1DMGmf6w23aOQjfPfjthfI0+USQ== + + + + ArangoDB PHP client: base handler + + + + + + + + Handler + \ArangoDBClient\Handler + + A base class for REST-based handlers + + + + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object + + + \ArangoDBClient\Connection + + + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + + + string + + + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + + string + + + + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler + + + \ArangoDBClient\Connection + + + + $connection + + \ArangoDBClient\Connection + + + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object + + + \ArangoDBClient\Connection + + + + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() + + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection + + + + mixed + + + \ArangoDBClient\ClientException + + + + $optionName + + + + + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + + array + + + string + + + \ArangoDBClient\ClientException + + + + $body + + array + + + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + Helper function that runs through the options given and includes them into the parameters array given. Only options that are set in $includeArray will be included. This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - + array - + array - + array - + array @@ -19822,21 +20699,20 @@ This is only for options that are to be sent to the ArangoDB server in a json bo array() array - \ArangoDBClient\Handler - + makeCollection \ArangoDBClient\Handler::makeCollection() - + Turn a value into a collection name - + \ArangoDBClient\ClientException - + mixed - + string @@ -19845,7 +20721,30 @@ This is only for options that are to be sent to the ArangoDB server in a json bo mixed - \ArangoDBClient\Handler + + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + + array + + + mixed + + + + $headers + + array + + + $collection + + mixed + setDocumentClass @@ -19888,840 +20787,1046 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\DocumentClassable - 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 - + - ArangoDB PHP client: statement + ArangoDB PHP client: mixin for $_documentClass functionality - + - - - Statement - \ArangoDBClient\Statement - - Container for an AQL query - Optional bind parameters can be used when issuing the AQL query to separate -the query from the values. -Executing a query will result in a cursor being created. - -There is an important distinction between two different types of statements: -<ul> -<li> statements that produce an array of documents as their result AND<br /> -<li> statements that do not produce documents -</ul> - -For example, a statement such as "FOR e IN example RETURN e" will produce -an array of documents as its result. The result can be treated as an array of -documents, and each document can be updated and sent back to the server by -the client.<br /> -<br /> -However, the query "RETURN 1 + 1" will not produce an array of documents as -its result, but an array with a single scalar value (the number 2). -"2" is not a valid document so creating a document from it will fail.<br /> -<br /> -To turn the results of this query into a document, the following needs to -be done: -<ul> -<li> modify the query to "RETURN { value: 1 + 1 }". The result will then be a - an array of documents with a "value" attribute<br /> -<li> use the "_flat" option for the statement to indicate that you don't want - to treat the statement result as an array of documents, but as a flat array -</ul> - - + + DocumentClassable + \ArangoDBClient\DocumentClassable + + Add functionality for $_documentClass + + + - - ENTRY_QUERY - \ArangoDBClient\Statement::ENTRY_QUERY - 'query' - - Query string index + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + + string + - - - ENTRY_COUNT - \ArangoDBClient\Statement::ENTRY_COUNT - 'count' - - Count option index + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + string + - - - ENTRY_BATCHSIZE - \ArangoDBClient\Statement::ENTRY_BATCHSIZE - 'batchSize' - - Batch size index + + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use + + string + + + \ArangoDBClient\DocumentClassable + - - - ENTRY_RETRIES - \ArangoDBClient\Statement::ENTRY_RETRIES - 'retries' - - Retries index + + $class + + string + + + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use + + string + + + \ArangoDBClient\DocumentClassable + - - - ENTRY_BINDVARS - \ArangoDBClient\Statement::ENTRY_BINDVARS - 'bindVars' - - Bind variables index + + $class + + string + + + + eJydUU1PwkAQve+vmAMJSlD8OhjxAwWC8UTClcQs26Hd2O42u1MjMfx3t1uoFAoS59Jm5817897cP6VRylin1WLQgmfDVagHLzB+HYOIJSq6g0R+SQVzbaDxHmiRJe61H3NrYZ4pQVIrHktauPmcopdy8cFDBCjZ+p7IN3lGkSNy9cYVTAgx4Ur5ltDpwsgwIuiXf1cXl7dtICMdobIwSmavbdeOdaiwDSM0bjoX7jCmeILWaeOWbPfXXBBUN67ztO2ixoOVSuT2rs9vvDQZLgkGmyx8FiP7ZrlPL56Xm/zkBqxzo8IS7lLOkyQNmcUVsOO/qdGEgjDYif0BmtPqXtM1XbPrZw8pDwNn6yhVdMi9ijmNU9tWmiA53gghOGCwXCvlhifrxRoF8lAy0DNImVE1aVdMZLNYivLYYJEqAyeF1KkHF2fKq0GRtGePO2kX6G6JW+3g4cXrsjb1MgvcE/nBHPbd6f8ZDNf3/MP/5t2P8c6W7AdpWkd8 + + + + ArangoDB PHP client: vertex document handler + + + + + + + + + \ArangoDBClient\DocumentHandler + VertexHandler + \ArangoDBClient\VertexHandler + + A handler that manages vertices. + A vertex-document handler that fetches vertices from the server and +persists them on the server. It does so by issuing the +appropriate HTTP requests to the server. + + + + + + ENTRY_DOCUMENTS + \ArangoDBClient\DocumentHandler::ENTRY_DOCUMENTS + 'documents' + + documents array index - - ENTRY_FAIL_ON_WARNING - \ArangoDBClient\Statement::ENTRY_FAIL_ON_WARNING - 'failOnWarning' - - Fail on warning flag + + OPTION_COLLECTION + \ArangoDBClient\DocumentHandler::OPTION_COLLECTION + 'collection' + + collection parameter - - ENTRY_MEMORY_LIMIT - \ArangoDBClient\Statement::ENTRY_MEMORY_LIMIT - 'memoryLimit' - - Memory limit threshold for query + + OPTION_EXAMPLE + \ArangoDBClient\DocumentHandler::OPTION_EXAMPLE + 'example' + + example parameter - - FULL_COUNT - \ArangoDBClient\Statement::FULL_COUNT - 'fullCount' - - Full count option index + + OPTION_OVERWRITE + \ArangoDBClient\DocumentHandler::OPTION_OVERWRITE + 'overwrite' + + overwrite option - - ENTRY_STREAM - \ArangoDBClient\Statement::ENTRY_STREAM - 'stream' - - Stream attribute + + OPTION_RETURN_OLD + \ArangoDBClient\DocumentHandler::OPTION_RETURN_OLD + 'returnOld' + + option for returning the old document - - ENTRY_TTL - \ArangoDBClient\Statement::ENTRY_TTL - 'ttl' - - TTL attribute + + OPTION_RETURN_NEW + \ArangoDBClient\DocumentHandler::OPTION_RETURN_NEW + 'returnNew' + + option for returning the new document - + $_connection - \ArangoDBClient\Statement::_connection + \ArangoDBClient\Handler::_connection - - The connection object + + Connection object - + \ArangoDBClient\Connection - - $_bindVars - \ArangoDBClient\Statement::_bindVars - - - The bind variables and values used for the statement + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + - - \ArangoDBClient\BindVars + + string - - $_batchSize - \ArangoDBClient\Statement::_batchSize - - - The current batch size (number of result documents retrieved per round-trip) + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + - - mixed + + string - - $_doCount - \ArangoDBClient\Statement::_doCount - false - - The count flag (should server return total number of results) - - - boolean - - - - - $_fullCount - \ArangoDBClient\Statement::_fullCount - false - - The count flag (should server return total number of results ignoring the limit) -Be careful! This option also prevents ArangoDB from using some server side optimizations! + + createFromArrayWithContext + \ArangoDBClient\VertexHandler::createFromArrayWithContext() + + Intermediate function to call the createFromArray function from the right context - - boolean + + + + \ArangoDBClient\Document + + + \ArangoDBClient\ClientException + - - - $_query - \ArangoDBClient\Statement::_query - - - The query string - - + + $data + + + + + $options + + + + + + get + \ArangoDBClient\DocumentHandler::get() + + Get a single document from a collection + Alias method for getById() + + \ArangoDBClient\Exception + + string - - - - $_flat - \ArangoDBClient\Statement::_flat - false - - "flat" flag (if set, the query results will be treated as a simple array, not documents) - - - boolean + + mixed - - - - $_sanitize - \ArangoDBClient\Statement::_sanitize - false - - Sanitation flag (if set, the _id and _rev attributes will be removed from the results) - - - boolean + + array - - - - $_retries - \ArangoDBClient\Statement::_retries - 0 - - Number of retries in case a deadlock occurs - - - boolean + + \ArangoDBClient\Document - - - $_cache - \ArangoDBClient\Statement::_cache - - - Whether or not the query cache should be consulted - - - boolean + + $collection + + string + + + $documentId + + mixed + + + $options + array() + array + + \ArangoDBClient\DocumentHandler + + + has + \ArangoDBClient\DocumentHandler::has() + + Check if a document exists + This will call self::get() internally and checks if there +was an exception thrown which represents an 404 request. + + \ArangoDBClient\Exception - - - - $_stream - \ArangoDBClient\Statement::_stream - - - Whether or not the query results should be build up dynamically and streamed to the -client application whenever available, or build up entirely on the server first and -then streamed incrementally (false) - - - boolean + + string - - - - $_ttl - \ArangoDBClient\Statement::_ttl - - - Number of seconds the cursor will be kept on the server if the statement result -is bigger than the initial batch size. The default value is a server-defined -value - - - double + + mixed - - - - $_failOnWarning - \ArangoDBClient\Statement::_failOnWarning - false - - Whether or not the cache should abort when it encounters a warning - - + boolean - - - $_memoryLimit - \ArangoDBClient\Statement::_memoryLimit - 0 - - Approximate memory limit value (in bytes) that a query can use on the server-side -(a value of 0 or less will mean the memory is not limited) - - - integer + + $collection + + string + + + $documentId + + mixed + + \ArangoDBClient\DocumentHandler + + + getById + \ArangoDBClient\DocumentHandler::getById() + + Get a single document from a collection + This will throw if the document cannot be fetched from the server. + + \ArangoDBClient\Exception - - - - $resultType - \ArangoDBClient\Statement::resultType - - - resultType - - + string - - - - $_documentClass - \ArangoDBClient\Statement::_documentClass - - - - - - - - __construct - \ArangoDBClient\Statement::__construct() - - Initialise the statement - The $data property can be used to specify the query text and further -options for the query. - -An important consideration when creating a statement is whether the -statement will produce a list of documents as its result or any other -non-document value. When a statement is created, by default it is -assumed that the statement will produce documents. If this is not the -case, executing a statement that returns non-documents will fail. - -To explicitly mark the statement as returning non-documents, the '_flat' -option should be specified in $data. - - \ArangoDBClient\Exception - - - \ArangoDBClient\Connection + + mixed - + array + + \ArangoDBClient\Document + - $connection + $collection - \ArangoDBClient\Connection + string - $data + $documentId - array + mixed + + $options + array() + array + + \ArangoDBClient\DocumentHandler - - getConnection - \ArangoDBClient\Statement::getConnection() - - Return the connection object - - - \ArangoDBClient\Connection - - - - - execute - \ArangoDBClient\Statement::execute() - - Execute the statement - This will post the query to the server and return the results as -a Cursor. The cursor can then be used to iterate the results. - + + getHead + \ArangoDBClient\DocumentHandler::getHead() + + Gets information about a single documents from a collection + This will throw if the document cannot be fetched from the server + \ArangoDBClient\Exception - - \ArangoDBClient\Cursor + + string - - - - explain - \ArangoDBClient\Statement::explain() - - Explain the statement's execution plan - This will post the query to the server and return the execution plan as an array. - - \ArangoDBClient\Exception + + mixed - - array + + boolean - - - - validate - \ArangoDBClient\Statement::validate() - - Validates the statement - This will post the query to the server for validation and return the validation result as an array. - - \ArangoDBClient\Exception + + string - + array - - - __invoke - \ArangoDBClient\Statement::__invoke() - - Invoke the statement - This will simply call execute(). Arguments are ignored. - - \ArangoDBClient\Exception - - - mixed - - - \ArangoDBClient\Cursor - - - $args + $collection + + string + + + $documentId mixed + + $revision + null + string + + + $ifMatch + null + boolean + + \ArangoDBClient\DocumentHandler - - __toString - \ArangoDBClient\Statement::__toString() - - Return a string representation of the statement + + createFromArrayWithContext + \ArangoDBClient\DocumentHandler::createFromArrayWithContext() + + Intermediate function to call the createFromArray function from the right context - - string + + + + \ArangoDBClient\Document + + + \ArangoDBClient\ClientException + + $data + + + + + $options + + + + \ArangoDBClient\DocumentHandler - - bind - \ArangoDBClient\Statement::bind() - - Bind a parameter to the statement - This method can either be called with a string $key and a -separate value in $value, or with an array of all bind -bind parameters in $key, with $value being NULL. + + store + \ArangoDBClient\DocumentHandler::store() + + Store a document to a collection + This is an alias/shortcut to save() and replace(). Instead of having to determine which of the 3 functions to use, +simply pass the document to store() and it will figure out which one to call. -Allowed value types for bind parameters are string, int, -double, bool and array. Arrays must not contain any other -than these types. - +This will throw if the document cannot be saved or replaced. + \ArangoDBClient\Exception - - mixed + + \ArangoDBClient\Document - + mixed - - void + + array + + mixed + + - $key + $document - mixed + \ArangoDBClient\Document - $value + $collection null mixed + + $options + array() + array + + \ArangoDBClient\DocumentHandler - - getBindVars - \ArangoDBClient\Statement::getBindVars() - - Get all bind parameters as an array - - - array + + insert + \ArangoDBClient\DocumentHandler::insert() + + insert a document into a collection + This will add the document to the collection and return the document's id + +This will throw if the document cannot be saved + + \ArangoDBClient\Exception - - - - setQuery - \ArangoDBClient\Statement::setQuery() - - Set the query string - - - \ArangoDBClient\ClientException + + mixed - - string + + \ArangoDBClient\Document + array - - void + + array + + mixed + + - $query + $collection - string + mixed + + $document + + \ArangoDBClient\Document|array + + + $options + array() + array + + \ArangoDBClient\DocumentHandler - - getQuery - \ArangoDBClient\Statement::getQuery() - - Get the query string - - - string - - - - - setResultType - \ArangoDBClient\Statement::setResultType() - - setResultType - - - - string - + + save + \ArangoDBClient\DocumentHandler::save() + + Insert a document into a collection + This is an alias for insert(). - $resultType + $collection - - - setCount - \ArangoDBClient\Statement::setCount() - - Set the count option for the statement - - - boolean - - - void - - - $value + $document - boolean + + + + $options + array() + array + \ArangoDBClient\DocumentHandler - - getCount - \ArangoDBClient\Statement::getCount() - - Get the count option value of the statement - - - boolean + + update + \ArangoDBClient\DocumentHandler::update() + + Update an existing document in a collection, identified by the including _id and optionally _rev in the patch document. + Attention - The behavior of this method has changed since version 1.1 + +This will update the document on the server + +This will throw if the document cannot be updated + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the document to-be-replaced is the same as the one given. + + \ArangoDBClient\Exception - - - - setFullCount - \ArangoDBClient\Statement::setFullCount() - - Set the full count option for the statement - - - boolean + + \ArangoDBClient\Document - - void + + array + + + boolean - $value + $document - boolean + \ArangoDBClient\Document + + + $options + array() + array + \ArangoDBClient\DocumentHandler - - getFullCount - \ArangoDBClient\Statement::getFullCount() - - Get the full count option value of the statement - - - boolean + + updateById + \ArangoDBClient\DocumentHandler::updateById() + + Update an existing document in a collection, identified by collection id and document id +Attention - The behavior of this method has changed since version 1.1 + This will update the document on the server + +This will throw if the document cannot be updated + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the document to-be-updated is the same as the one given. + + \ArangoDBClient\Exception - - - - setTtl - \ArangoDBClient\Statement::setTtl() - - Set the ttl option for the statement - - - double + + string - - void + + mixed + + + \ArangoDBClient\Document + + + array + + + boolean - $value + $collection - double + string + + + $documentId + + mixed + + + $document + + \ArangoDBClient\Document + + + $options + array() + array + \ArangoDBClient\DocumentHandler - - getTtl - \ArangoDBClient\Statement::getTtl() - - Get the ttl option value of the statement - - - double + + replace + \ArangoDBClient\DocumentHandler::replace() + + Replace an existing document in a collection, identified by the document itself + This will replace the document on the server + +This will throw if the document cannot be replaced + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the to-be-replaced document is the same as the one given. + + \ArangoDBClient\Exception - - - - setStream - \ArangoDBClient\Statement::setStream() - - Set the streaming option for the statement - - - boolean + + \ArangoDBClient\Document - - void + + array + + + boolean - $value + $document - boolean + \ArangoDBClient\Document + + + $options + array() + array + \ArangoDBClient\DocumentHandler - - getStream - \ArangoDBClient\Statement::getStream() - - Get the streaming option value of the statement - - + + replaceById + \ArangoDBClient\DocumentHandler::replaceById() + + Replace an existing document in a collection, identified by collection id and document id + This will update the document on the server + +This will throw if the document cannot be Replaced + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the to-be-replaced document is the same as the one given. + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + \ArangoDBClient\Document + + + array + + boolean + + $collection + + mixed + + + $documentId + + mixed + + + $document + + \ArangoDBClient\Document + + + $options + array() + array + + \ArangoDBClient\DocumentHandler - - setCache - \ArangoDBClient\Statement::setCache() - - Set the caching option for the statement + + remove + \ArangoDBClient\DocumentHandler::remove() + + Remove a document from a collection, identified by the document itself - - boolean + + \ArangoDBClient\Exception - - void + + \ArangoDBClient\Document + + + array + + + boolean - $value + $document - boolean + \ArangoDBClient\Document + + + $options + array() + array + \ArangoDBClient\DocumentHandler - - getCache - \ArangoDBClient\Statement::getCache() - - Get the caching option value of the statement + + removeById + \ArangoDBClient\DocumentHandler::removeById() + + Remove a document from a collection, identified by the collection id and document id - + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + mixed + + + array + + boolean + + $collection + + mixed + + + $documentId + + mixed + + + $revision + null + mixed + + + $options + array() + array + + \ArangoDBClient\DocumentHandler - - setFailOnWarning - \ArangoDBClient\Statement::setFailOnWarning() - - Set whether or not the cache should abort when it encounters a warning + + getDocumentId + \ArangoDBClient\DocumentHandler::getDocumentId() + + Helper function to get a document id from a document or a document id value - - boolean + + \ArangoDBClient\ClientException - - void + + mixed + + + mixed - $value - true - boolean + $document + + mixed + \ArangoDBClient\DocumentHandler - - getFailOnWarning - \ArangoDBClient\Statement::getFailOnWarning() - - Get the configured value for fail-on-warning + + getRevision + \ArangoDBClient\DocumentHandler::getRevision() + + Helper function to get a document id from a document or a document id value - - boolean + + \ArangoDBClient\ClientException - - - - setMemoryLimit - \ArangoDBClient\Statement::setMemoryLimit() - - Set the approximate memory limit threshold to be used by the query on the server-side -(a value of 0 or less will mean the memory is not limited) - - - integer + + mixed - - void + + mixed - $value + $document - integer + mixed + \ArangoDBClient\DocumentHandler - - getMemoryLimit - \ArangoDBClient\Statement::getMemoryLimit() - - Get the configured memory limit for the statement + + lazyCreateCollection + \ArangoDBClient\DocumentHandler::lazyCreateCollection() + + - - integer + + mixed + + + array + + $collection + + mixed + + + $options + + array + + \ArangoDBClient\DocumentHandler - - setBatchSize - \ArangoDBClient\Statement::setBatchSize() - - Set the batch size for the statement - The batch size is the number of results to be transferred -in one server round-trip. If a query produces more results -than the batch size, it creates a server-side cursor that -provides the additional results. - -The server-side cursor can be accessed by the client with subsequent HTTP requests. - + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler + + + \ArangoDBClient\Connection + + + + $connection + + \ArangoDBClient\Connection + + \ArangoDBClient\Handler + + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object + + + \ArangoDBClient\Connection + + + \ArangoDBClient\Handler + + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() + + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection + + + + mixed + + \ArangoDBClient\ClientException - - integer + + + $optionName + + + + \ArangoDBClient\Handler + + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + + array - - void + + string + + + \ArangoDBClient\ClientException - $value + $body - integer + array + \ArangoDBClient\Handler - - getBatchSize - \ArangoDBClient\Statement::getBatchSize() - - Get the batch size for the statement - - - integer + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + + Helper function that runs through the options given and includes them into the parameters array given. + Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . + + array + + + array + + + array + + + array + + $options + + array + + + $body + + array + + + $includeArray + array() + array + + \ArangoDBClient\Handler - - buildData - \ArangoDBClient\Statement::buildData() - - Build an array of data to be posted to the server when issuing the statement + + makeCollection + \ArangoDBClient\Handler::makeCollection() + + Turn a value into a collection name - - array + + \ArangoDBClient\ClientException + + + mixed + + + string + + $value + + mixed + + \ArangoDBClient\Handler - - getCursorOptions - \ArangoDBClient\Statement::getCursorOptions() - - Return an array of cursor options + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation - + array + + mixed + + + $headers + + array + + + $collection + + mixed + + \ArangoDBClient\Handler - + setDocumentClass - \ArangoDBClient\Statement::setDocumentClass() - + \ArangoDBClient\DocumentClassable::setDocumentClass() + Sets the document class to use - + string - - \ArangoDBClient\Statement + + \ArangoDBClient\DocumentClassable + + + + $class + + string + + \ArangoDBClient\DocumentClassable + + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use + + + string + + + \ArangoDBClient\DocumentClassable @@ -20729,1216 +21834,1461 @@ The server-side cursor can be accessed by the client with subsequent HTTP reques string + \ArangoDBClient\DocumentClassable - - No summary for property $_documentClass - - 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 - + - ArangoDB PHP client: Base URLs + ArangoDB PHP client: HTTP response - + - Urls - \ArangoDBClient\Urls - - Some basic URLs - - - + HttpResponse + \ArangoDBClient\HttpResponse + + Container class for HTTP responses + <br> + + - - URL_DOCUMENT - \ArangoDBClient\Urls::URL_DOCUMENT - '/_api/document' - - URL base part for document-related CRUD operations REST calls + + HEADER_LOCATION + \ArangoDBClient\HttpResponse::HEADER_LOCATION + 'location' + + HTTP location header - - URL_EDGE - \ArangoDBClient\Urls::URL_EDGE - '/_api/document' - - URL base part for edge-related CRUD operations REST calls + + HEADER_LEADER_ENDPOINT + \ArangoDBClient\HttpResponse::HEADER_LEADER_ENDPOINT + 'x-arango-endpoint' + + HTTP leader endpoint header, used in failover - - URL_EDGES - \ArangoDBClient\Urls::URL_EDGES - '/_api/edges' - - URL base part for all retrieving connected edges + + $_header + \ArangoDBClient\HttpResponse::_header + '' + + The header retrieved - - - - URL_GRAPH - \ArangoDBClient\Urls::URL_GRAPH - '/_api/gharial' - - URL base part for all graph-related REST calls + + string + + + + + $_body + \ArangoDBClient\HttpResponse::_body + '' + + The body retrieved + + string + - - - URL_VIEW - \ArangoDBClient\Urls::URL_VIEW - '/_api/view' - - URL base part for all view-related REST calls + + + $_headers + \ArangoDBClient\HttpResponse::_headers + array() + + All headers retrieved as an assoc array + + array + - - - URLPART_VERTEX - \ArangoDBClient\Urls::URLPART_VERTEX - 'vertex' + + + $_result + \ArangoDBClient\HttpResponse::_result + '' - URL part vertex-related graph REST calls + The result status-line (first line of HTTP response header) + + string + - - - URLPART_EDGE - \ArangoDBClient\Urls::URLPART_EDGE - 'edge' - - URL part for edge-related graph REST calls + + + $_httpCode + \ArangoDBClient\HttpResponse::_httpCode + + + The HTTP status code of the response + + integer + - - - URL_COLLECTION - \ArangoDBClient\Urls::URL_COLLECTION - '/_api/collection' - - URL base part for all collection-related REST calls + + + $_wasAsync + \ArangoDBClient\HttpResponse::_wasAsync + false + + Whether or not the response is for an async request without a response body + + boolean + - - - URL_INDEX - \ArangoDBClient\Urls::URL_INDEX - '/_api/index' - - URL base part for all index-related REST calls + + + $batchPart + \ArangoDBClient\HttpResponse::batchPart + + + Whether or not the response is for an async request without a response body + + \ArangoDBClient\Batchpart + - - - URL_CURSOR - \ArangoDBClient\Urls::URL_CURSOR - '/_api/cursor' - - base URL part for cursor related operations + + + __construct + \ArangoDBClient\HttpResponse::__construct() + + Set up the response + + string + + + string + + + string + + + boolean + + + \ArangoDBClient\ClientException + - - - URL_EXPORT - \ArangoDBClient\Urls::URL_EXPORT - '/_api/export' - - URL for export related operations + + $responseString + + string + + + $originUrl + null + string + + + $originMethod + null + string + + + $wasAsync + false + boolean + + + + getHttpCode + \ArangoDBClient\HttpResponse::getHttpCode() + + Return the HTTP status code of the response + + integer + - - - URL_EXPLAIN - \ArangoDBClient\Urls::URL_EXPLAIN - '/_api/explain' - - URL for AQL explain-related operations + + + getHeader + \ArangoDBClient\HttpResponse::getHeader() + + Return an individual HTTP headers of the response + + string + + + string + - - - URL_QUERY - \ArangoDBClient\Urls::URL_QUERY - '/_api/query' - - URL for AQL query validation-related operations + + $name + + string + + + + getHeaders + \ArangoDBClient\HttpResponse::getHeaders() + + Return the HTTP headers of the response + + array + - - - URL_EXAMPLE - \ArangoDBClient\Urls::URL_EXAMPLE - '/_api/simple/by-example' - - URL for select-by-example + + + getLocationHeader + \ArangoDBClient\HttpResponse::getLocationHeader() + + Return the location HTTP header of the response + + string + - - - URL_FIRST_EXAMPLE - \ArangoDBClient\Urls::URL_FIRST_EXAMPLE - '/_api/simple/first-example' - - URL for first-example + + + getLeaderEndpointHeader + \ArangoDBClient\HttpResponse::getLeaderEndpointHeader() + + Return the leader location HTTP header of the response + + string + - - - URL_ANY - \ArangoDBClient\Urls::URL_ANY - '/_api/simple/any' - - URL for any + + + getBody + \ArangoDBClient\HttpResponse::getBody() + + Return the body of the response + + string + - - - URL_FULLTEXT - \ArangoDBClient\Urls::URL_FULLTEXT - '/_api/simple/fulltext' - - URL for fulltext + + + getResult + \ArangoDBClient\HttpResponse::getResult() + + Return the result line (first header line) of the response + + string + - - - URL_REMOVE_BY_EXAMPLE - \ArangoDBClient\Urls::URL_REMOVE_BY_EXAMPLE - '/_api/simple/remove-by-example' - - URL remove-by-example + + + getJson + \ArangoDBClient\HttpResponse::getJson() + + Return the data from the JSON-encoded body + + \ArangoDBClient\ClientException + + + array + - - - URL_REMOVE_BY_KEYS - \ArangoDBClient\Urls::URL_REMOVE_BY_KEYS - '/_api/simple/remove-by-keys' - - URL for remove-by-keys + + + setBatchPart + \ArangoDBClient\HttpResponse::setBatchPart() + + + + \ArangoDBClient\Batchpart + + + \ArangoDBClient\HttpResponse + - - - URL_UPDATE_BY_EXAMPLE - \ArangoDBClient\Urls::URL_UPDATE_BY_EXAMPLE - '/_api/simple/update-by-example' - - URL for update-by-example + + $batchPart + + \ArangoDBClient\Batchpart + + + + getBatchPart + \ArangoDBClient\HttpResponse::getBatchPart() + + + + \ArangoDBClient\Batchpart + - - - URL_REPLACE_BY_EXAMPLE - \ArangoDBClient\Urls::URL_REPLACE_BY_EXAMPLE - '/_api/simple/replace-by-example' - - URL for replace-by-example + + + + No summary for method setBatchPart() + No summary for method getBatchPart() + + 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 + + + + ArangoDB PHP client: bind variables + + + + + + + + BindVars + \ArangoDBClient\BindVars + + A simple container for bind variables + This container also handles validation of the bind values.<br> +<br> + + + + + $_values + \ArangoDBClient\BindVars::_values + array() + + Current bind values + + array + - - - URL_LOOKUP_BY_KEYS - \ArangoDBClient\Urls::URL_LOOKUP_BY_KEYS - '/_api/simple/lookup-by-keys' - - URL for lookup-by-keys + + + getAll + \ArangoDBClient\BindVars::getAll() + + Get all registered bind variables + + array + - - - URL_RANGE - \ArangoDBClient\Urls::URL_RANGE - '/_api/simple/range' - - URL for select-range + + + getCount + \ArangoDBClient\BindVars::getCount() + + Get the number of bind variables registered + + integer + - - - URL_ALL - \ArangoDBClient\Urls::URL_ALL - '/_api/simple/all' - - URL for select-all + + + set + \ArangoDBClient\BindVars::set() + + Set the value of a single bind variable or set all bind variables at once + This will also validate the bind values. + +Allowed value types for bind parameters are string, int, +double, bool and array. Arrays must not contain any other +than these types. + + \ArangoDBClient\ClientException + + + string + integer + array + + + string + + + void + + + + $name + + string|integer|array + + + $value + null + string + + + + get + \ArangoDBClient\BindVars::get() + + Get the value of a bind variable with a specific name + + string + + + mixed + - - - URL_ALL_KEYS - \ArangoDBClient\Urls::URL_ALL_KEYS - '/_api/simple/all-keys' - - URL for select-all-keys + + $name + + string + + + + eJylVlFP2zAQfs+vuEmVaKsWGI8tMKCbQHsZGhMvgCo3vSYWrh3ZDqVa+993dhzapA1sml8CuTvf9919d+nplyzNouio242gC5eayUR9vYLbm1uIBUdpBzDhcgovTHM2EWjIzXleZCx+ZgkCvAWNvL83stymSpMNvjMJdxZxzqT0plhlS82T1MLo7a+T488nPbCUIUFp4Ho+uemRWahEYg+uUVP0kqKPokiyORrKjbW0ww0HMHyeCYRYScu4RA0zwrKXxa+Umy0/JoyClMkpeZCv4FNmuZKgZmBTLK8QOZrD04k+dzeE58clMVzGzgRwfHjiucSCGQNXdOk90yb6HTmjJ+FOF0a51hS9nTaYSo8L4gNMa7YMb478M9P8hVmE1riIgjN4eKIC1e6/RkuMBWhMuLGocbpTpGo2jTbXskgI/fCk2vzNJQFZPhE8hlkuY1/YBO2lEO2ONxYFcCckallqT/88sBh683ovDdcdmc8n1EPCUwWwBa2BEKci9/8hvpHLSOXSNrGJvbHKqdNE6i6Q8m6+xqRqmQisggMStgltrKFmFhQprkbZC37Byd1rPWgcd+RdC6MmqQUGK9hlRgnehipjmoaSCkRJNYKhOZZJz1W1V8ZPFRWLRnmiFGWmGK+dQ5oTehiY58aCVLYcRXIhYREmXV5gaSodSBOy1wFe2FSrhYFi4L69xpi5ptS9PNSAcEUAV4WGW26rgNOAe9YVAD9+EqAg9wW36Z5y780Am9MqKtcPFdxZSA3KfFH8fdFR89sefa9McUZCFqKuQT6DNjdjz6EI6HS2zO4QJmRxCoUZmAk31v3cuXeG+0I8Sg8GpY7aIWRYiVhX/qtOAOH1+TYRa0BBba4mDfi5DHQ7sFoBvSgK3cBoN9tDuwjoFEmfXHZvGf4vxX2g3fG6BImLujTbB1cVkfmim1TlgjZoOUVuvonzQWNB1x8sxa39UdV0oWMwGcZ8Ropy6d+bljAjDSPSIN85f6Wl0d+g2BfUuE1DV/co+ZPX8fgZl2N8pd1s3magul3rggiw3IBs6S16/7vzUEil3NTk7j/cY9IDM+3y8z0Y+Lc9OHgsf8c8hl8Bk8fSyfXxDz43w2I= + + + + ArangoDB PHP client: update policies + + + + + + + + UpdatePolicy + \ArangoDBClient\UpdatePolicy + + Document update policies + + + + + + LAST + \ArangoDBClient\UpdatePolicy::LAST + 'last' + + last update will win in case of conflicting versions - - URL_NEAR - \ArangoDBClient\Urls::URL_NEAR - '/_api/simple/near' - - URL for select-range + + ERROR + \ArangoDBClient\UpdatePolicy::ERROR + 'error' + + an error will be returned in case of conflicting versions - - URL_WITHIN - \ArangoDBClient\Urls::URL_WITHIN - '/_api/simple/within' - - URL for select-range + + validate + \ArangoDBClient\UpdatePolicy::validate() + + Check if the supplied policy value is valid + + \ArangoDBClient\ClientException + + + string + + + void + - - - URL_IMPORT - \ArangoDBClient\Urls::URL_IMPORT - '/_api/import' - - URL for document import + + $value + + string + + + + eJydU2Fr2zAQ/e5fcYNRJyFdunx0G9ouLe3GYCFdvwWKopxtUVsSkpwslP73nSTHpF6hMGFko7v33t07+eJSlzpJJqNRAiO4NkwW6uYbLO4XwCuB0mXQ6A1zCFpVggu0lOdTrzTjz6xAgA41D4AQZI0rlaEY/GASHhxizaQMIa703oiidDDvvqZnX6djcEYQobRwV6/vxxSuVCFxDHdoCL0n9CRJJKvRkjb2ZM+7Jm4Ub2o6+ajwd8q2QnLf0dmXaVDjFbMWHgPPwtPsk5fEdxWk/BoBpXRSO1FVtEmghzOLoHLgSuaEdEIWsEVjhZK2xU7CmxKI4ef1w2+YQerpUmqmp0IuojFkaZBYIxh0jZG4+Q+p2+Xy19JrBcZ3xOYl8mcQObgSwTZak0Ob6OMetqxqEIT1H2LTQg7IK1catbMQPb39w1E7qqKfpZlhNVgaOFX6OTKevplXq9MHxq5hqzrl2Jhu1gQiRubolTeSe9lYInEOosYw5MYJ+kXDReMGwj7FUg5pw9YSv8iF9hg+zWZgscqzLAzr5AT+CQRrh0cSfgVPQOKub8sg/S5DiW9bT0n/gH1N4v6axMv4ROnMDo6vZJaFyBjS1eEPWrV3e706TvS8fwH05C35 + + + + ArangoDB PHP client: Base URLs + + + + + + + + Urls + \ArangoDBClient\Urls + + Some basic URLs + + + + + + URL_DOCUMENT + \ArangoDBClient\Urls::URL_DOCUMENT + '/_api/document' + + URL base part for document-related CRUD operations REST calls - - URL_BATCH - \ArangoDBClient\Urls::URL_BATCH - '/_api/batch' - - URL for batch processing + + URL_EDGE + \ArangoDBClient\Urls::URL_EDGE + '/_api/document' + + URL base part for edge-related CRUD operations REST calls - - URL_TRANSACTION - \ArangoDBClient\Urls::URL_TRANSACTION - '/_api/transaction' - - URL for transactions + + URL_EDGES + \ArangoDBClient\Urls::URL_EDGES + '/_api/edges' + + URL base part for all retrieving connected edges - - URL_ENGINE - \ArangoDBClient\Urls::URL_ENGINE - '/_api/engine' - - URL for storage engine + + URL_GRAPH + \ArangoDBClient\Urls::URL_GRAPH + '/_api/gharial' + + URL base part for all graph-related REST calls - - URL_ADMIN_VERSION - \ArangoDBClient\Urls::URL_ADMIN_VERSION - '/_api/version' - - URL for admin version + + URL_VIEW + \ArangoDBClient\Urls::URL_VIEW + '/_api/view' + + URL base part for all view-related REST calls - - URL_ADMIN_SERVER_ROLE - \ArangoDBClient\Urls::URL_ADMIN_SERVER_ROLE - '/_admin/server/role' - - URL for server role + + URLPART_VERTEX + \ArangoDBClient\Urls::URLPART_VERTEX + 'vertex' + + URL part vertex-related graph REST calls - - URL_ADMIN_TIME - \ArangoDBClient\Urls::URL_ADMIN_TIME - '/_admin/time' - - URL for admin time + + URLPART_EDGE + \ArangoDBClient\Urls::URLPART_EDGE + 'edge' + + URL part for edge-related graph REST calls - - URL_ADMIN_LOG - \ArangoDBClient\Urls::URL_ADMIN_LOG - '/_admin/log' - - URL for admin log + + URL_COLLECTION + \ArangoDBClient\Urls::URL_COLLECTION + '/_api/collection' + + URL base part for all collection-related REST calls - - URL_ADMIN_ROUTING_RELOAD - \ArangoDBClient\Urls::URL_ADMIN_ROUTING_RELOAD - '/_admin/routing/reload' - - base URL part for admin routing reload + + URL_INDEX + \ArangoDBClient\Urls::URL_INDEX + '/_api/index' + + URL base part for all index-related REST calls - - URL_ADMIN_STATISTICS - \ArangoDBClient\Urls::URL_ADMIN_STATISTICS - '/_admin/statistics' - - base URL part for admin statistics + + URL_CURSOR + \ArangoDBClient\Urls::URL_CURSOR + '/_api/cursor' + + base URL part for cursor related operations - - URL_ADMIN_STATISTICS_DESCRIPTION - \ArangoDBClient\Urls::URL_ADMIN_STATISTICS_DESCRIPTION - '/_admin/statistics-description' - - base URL part for admin statistics-description + + URL_EXPORT + \ArangoDBClient\Urls::URL_EXPORT + '/_api/export' + + URL for export related operations - - URL_AQL_USER_FUNCTION - \ArangoDBClient\Urls::URL_AQL_USER_FUNCTION - '/_api/aqlfunction' - - base URL part for AQL user functions statistics + + URL_EXPLAIN + \ArangoDBClient\Urls::URL_EXPLAIN + '/_api/explain' + + URL for AQL explain-related operations - - URL_USER - \ArangoDBClient\Urls::URL_USER - '/_api/user' - - base URL part for user management + + URL_QUERY + \ArangoDBClient\Urls::URL_QUERY + '/_api/query' + + URL for AQL query validation-related operations - - URL_TRAVERSAL - \ArangoDBClient\Urls::URL_TRAVERSAL - '/_api/traversal' - - base URL part for user management + + URL_EXAMPLE + \ArangoDBClient\Urls::URL_EXAMPLE + '/_api/simple/by-example' + + URL for select-by-example - - URL_ENDPOINT - \ArangoDBClient\Urls::URL_ENDPOINT - '/_api/endpoint' - - base URL part for endpoint management + + URL_FIRST_EXAMPLE + \ArangoDBClient\Urls::URL_FIRST_EXAMPLE + '/_api/simple/first-example' + + URL for first-example - - URL_DATABASE - \ArangoDBClient\Urls::URL_DATABASE - '/_api/database' - - base URL part for database management + + URL_ANY + \ArangoDBClient\Urls::URL_ANY + '/_api/simple/any' + + URL for any - - URL_QUERY_CACHE - \ArangoDBClient\Urls::URL_QUERY_CACHE - '/_api/query-cache' - - URL for AQL query result cache + + URL_FULLTEXT + \ArangoDBClient\Urls::URL_FULLTEXT + '/_api/simple/fulltext' + + URL for fulltext - - URL_UPLOAD - \ArangoDBClient\Urls::URL_UPLOAD - '/_api/upload' - - URL for file uploads + + URL_REMOVE_BY_EXAMPLE + \ArangoDBClient\Urls::URL_REMOVE_BY_EXAMPLE + '/_api/simple/remove-by-example' + + URL remove-by-example - - URL_FOXX_INSTALL - \ArangoDBClient\Urls::URL_FOXX_INSTALL - '/_admin/foxx/install' - - URL for foxx-app installations + + URL_REMOVE_BY_KEYS + \ArangoDBClient\Urls::URL_REMOVE_BY_KEYS + '/_api/simple/remove-by-keys' + + URL for remove-by-keys - - URL_FOXX_UNINSTALL - \ArangoDBClient\Urls::URL_FOXX_UNINSTALL - '/_admin/foxx/uninstall' - - URL for foxx-app deinstallation + + URL_UPDATE_BY_EXAMPLE + \ArangoDBClient\Urls::URL_UPDATE_BY_EXAMPLE + '/_api/simple/update-by-example' + + URL for update-by-example - - eJytmG1zozYQx9/7U+hd2kxcX/My105LMOfQw0B4yCUzmfHIWGczwcBJwpdMp9+9K2Eb/CDBpc2bZIL2/9Muu6sVv/1RrsrBYHR5OUCXyKA4XxbjW+Tf+SjJUpLzG3SLGUFx4DBYIRb9WeLkBS8JQvv1plwqH+KKrwoKz9BfOEchJ2SN81w+SoryjabLFUfm/q/rD79eXyFOUxDMGZqs53dX8Dgrljm5QhNCwfoNrEeDQY7XhAGbHGE/7rcfFmuC5pilydn9ntktS/NEOPLhl2sJwXPGKU44OI8ZQzHN2ODvgfBGIsTPpdAWFIJKTDn6Ct4uiqRag+aQkgxzskBmEI9RURKKeVqAX4EVRijBGcjVIiP5O4FnXOjNxp4ZTy03Qr+ji9EMl+lop3kB/nVugCyW5P1wazyx3gkGVUQJvD+ySfOl0MxJIjYhdqTjhQ1QLu1NW1Jcrva+dvo2CQz/rmEtVxhyLQOaWNaPuEnJ9/7AB9v60vCErcI1ydgQysnrXl0618nwjSCaPVhBZD0KUq2ho5ykyA9wdskh7Hu/pKTIMsgDSL/+gTM9x7HMyPbcJnyNTm90mi9aAe2k2u64jmINlNZnWPNtE2xYSUUZ/NqBmnpTuRcHoRe0XJP2CrfkC3stC2D1BliPvhe0GkhtrwEY946AZDht3lIfimPY7gFGKHRwvlWEvqENztIFPkiLTuB9bAVPDU4KaWCMiIQZzt+G5BWvy4wo/TCmvtNqeywVq0eNoQbyNaWMdwA+2UEYKTEHChqSPP3O6hvu04kqrNbtusoyaBRcteHYcaCjRKd73doppClZFxvSHfHAmnoP1uz2SRmUEyWNM83aF/Kmyp0G+dl6CjU8oaGBVSVkbQ8XY39sRFoXT5S0LkJlJb0iCzVpdoT2WEsDzoripSo7Yut43ufYV8b2UKO7YMVspvTPcCdnXBIW3cLQ+1UV5DinFZRlvSR1kQHd8zHZ2f23aLiWEZxI5wTrzpIesl/s6K7d17fC31O+0nb33biIYD2cN6pjdnp4ONWLNbJzzJMVKmmREAZT+lKhe2tEZmu8k1YaVRjuc4YT3XkTQbaFxtEc0rLTjI4y0ryg4rJB8mWaKw8fd2K7rYyuF+uOgcU6zcWwyGAHqrQbT21XjIXhwda3RtrkoLAI0ULZYGrp0ApAfRZ4+/4idjWqzUfCvNMDnq71jMieHogLg05VuC1qRR1v0taE5b0mvFqcFhUXVxsYWAq80HICL45sdwL92PGMcRu5FRnVIj9AZxyGI8bTRNls6lcTGZEdRrYZHryZvfG7iMMFYQlNS96Vcw19NrZCM7D9VvUc7aQt2mtXYnqsIMdgfMnrwu0RlHs4iyFdYaZxjyoZf8t2Qr3wEr3GOdT0Wn41OAsUsIYhbP5HcehIoqoN56AfibrG5w6rUwzJF2WRQovuRFnu2Pfs9meInW0vEMw2WP63EwRzknFrhO3PDlvbXhcJSliVcbjYJStVP5H3hplpmHfW0e1hKM20431GYOYTparKsNhvlbh45aWisPeaxevrEJcl3E8hfbNMe+f55D0+ws0U6mo/osgyEiKjrUAf1oK0aTpY7KpwVd4A/xkM5IexGdzjMPtJfB67uZH/uUIXz7uveM/bD23zZ7Hg4uePg38BaMq1fw== - - - - ArangoDB PHP client: connection - - - - - - - - - TraceResponse - \ArangoDBClient\TraceResponse - - Class TraceResponse - - - - - - - $_headers - \ArangoDBClient\TraceResponse::_headers - array() - - Stores each header as an array (key => value) element + + URL_REPLACE_BY_EXAMPLE + \ArangoDBClient\Urls::URL_REPLACE_BY_EXAMPLE + '/_api/simple/replace-by-example' + + URL for replace-by-example - - array - - - - $_httpCode - \ArangoDBClient\TraceResponse::_httpCode - - - The http status code + + + URL_LOOKUP_BY_KEYS + \ArangoDBClient\Urls::URL_LOOKUP_BY_KEYS + '/_api/simple/lookup-by-keys' + + URL for lookup-by-keys - - integer - - - - $_body - \ArangoDBClient\TraceResponse::_body - - - The raw body of the response + + + URL_RANGE + \ArangoDBClient\Urls::URL_RANGE + '/_api/simple/range' + + URL for select-range - - string - - - - $_type - \ArangoDBClient\TraceResponse::_type - 'response' - - The type of http message + + + URL_ALL + \ArangoDBClient\Urls::URL_ALL + '/_api/simple/all' + + URL for select-all - - string - - - - $_timeTaken - \ArangoDBClient\TraceResponse::_timeTaken - - - The time taken to send and receive a response in seconds + + + URL_ALL_KEYS + \ArangoDBClient\Urls::URL_ALL_KEYS + '/_api/simple/all-keys' + + URL for select-all-keys - - float - - - - $_httpCodeDefinitions - \ArangoDBClient\TraceResponse::_httpCodeDefinitions - array(100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported') - - Used to look up the definition for an http code + + + URL_NEAR + \ArangoDBClient\Urls::URL_NEAR + '/_api/simple/near' + + URL for select-range - - array - - - - __construct - \ArangoDBClient\TraceResponse::__construct() - - Set up the response trace + + + URL_WITHIN + \ArangoDBClient\Urls::URL_WITHIN + '/_api/simple/within' + + URL for select-range - - array - - - integer - - - string - - - - $headers - - array - - - $httpCode - - integer - - - $body - - string - - - $timeTaken - - - - - - getHeaders - \ArangoDBClient\TraceResponse::getHeaders() - - Get an array of the response headers + + + URL_IMPORT + \ArangoDBClient\Urls::URL_IMPORT + '/_api/import' + + URL for document import - - array - - - - getHttpCode - \ArangoDBClient\TraceResponse::getHttpCode() - - Get the http response code + + + URL_BATCH + \ArangoDBClient\Urls::URL_BATCH + '/_api/batch' + + URL for batch processing - - integer - - - - getHttpCodeDefinition - \ArangoDBClient\TraceResponse::getHttpCodeDefinition() - - Get the http code definition + + + URL_TRANSACTION + \ArangoDBClient\Urls::URL_TRANSACTION + '/_api/transaction' + + URL for transactions - - \ArangoDBClient\ClientException - - - string - - - - getBody - \ArangoDBClient\TraceResponse::getBody() - - Get the response body - - - string - + + + URL_ENGINE + \ArangoDBClient\Urls::URL_ENGINE + '/_api/engine' + + URL for storage engine + - - - getType - \ArangoDBClient\TraceResponse::getType() - - Get the http message type + + + URL_ADMIN_VERSION + \ArangoDBClient\Urls::URL_ADMIN_VERSION + '/_api/version' + + URL for admin version - - string - - - - getTimeTaken - \ArangoDBClient\TraceResponse::getTimeTaken() - - Get the time taken for this request + + + URL_ADMIN_SERVER_ROLE + \ArangoDBClient\Urls::URL_ADMIN_SERVER_ROLE + '/_admin/server/role' + + URL for server role - + + + URL_ADMIN_TIME + \ArangoDBClient\Urls::URL_ADMIN_TIME + '/_admin/time' + + URL for admin time + + + + + URL_ADMIN_LOG + \ArangoDBClient\Urls::URL_ADMIN_LOG + '/_admin/log' + + URL for admin log + + + + + URL_ADMIN_ROUTING_RELOAD + \ArangoDBClient\Urls::URL_ADMIN_ROUTING_RELOAD + '/_admin/routing/reload' + + base URL part for admin routing reload + + + + + URL_ADMIN_STATISTICS + \ArangoDBClient\Urls::URL_ADMIN_STATISTICS + '/_admin/statistics' + + base URL part for admin statistics + + + + + URL_ADMIN_STATISTICS_DESCRIPTION + \ArangoDBClient\Urls::URL_ADMIN_STATISTICS_DESCRIPTION + '/_admin/statistics-description' + + base URL part for admin statistics-description + + + + + URL_AQL_USER_FUNCTION + \ArangoDBClient\Urls::URL_AQL_USER_FUNCTION + '/_api/aqlfunction' + + base URL part for AQL user functions statistics + + + + + URL_USER + \ArangoDBClient\Urls::URL_USER + '/_api/user' + + base URL part for user management + + + + + URL_TRAVERSAL + \ArangoDBClient\Urls::URL_TRAVERSAL + '/_api/traversal' + + base URL part for user management + + + + + URL_ENDPOINT + \ArangoDBClient\Urls::URL_ENDPOINT + '/_api/endpoint' + + base URL part for endpoint management + + + + + URL_DATABASE + \ArangoDBClient\Urls::URL_DATABASE + '/_api/database' + + base URL part for database management + + + + + URL_QUERY_CACHE + \ArangoDBClient\Urls::URL_QUERY_CACHE + '/_api/query-cache' + + URL for AQL query result cache + + + + + URL_UPLOAD + \ArangoDBClient\Urls::URL_UPLOAD + '/_api/upload' + + URL for file uploads + + + + + URL_FOXX_INSTALL + \ArangoDBClient\Urls::URL_FOXX_INSTALL + '/_admin/foxx/install' + + URL for foxx-app installations + + + + + URL_FOXX_UNINSTALL + \ArangoDBClient\Urls::URL_FOXX_UNINSTALL + '/_admin/foxx/uninstall' + + URL for foxx-app deinstallation + + + - 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 - + - ArangoDB PHP client: admin document handler + ArangoDB PHP client: single document - - - - + + + - - \ArangoDBClient\Handler - AdminHandler - \ArangoDBClient\AdminHandler - - Provides access to ArangoDB's administration interface - The admin handler utilizes ArangoDB's Admin API. - - - + + + EdgeDefinition + \ArangoDBClient\EdgeDefinition + + Value object representing an edge Definition. + An edge definition contains a collection called 'relation' to store the edges and +multiple vertices collection defined in 'fromCollections' and 'toCollections'. + +<br> + + - - OPTION_DETAILS - \ArangoDBClient\AdminHandler::OPTION_DETAILS - 'details' - - details for server version - - - - - $_connection - \ArangoDBClient\Handler::_connection + + $_relation + \ArangoDBClient\EdgeDefinition::_relation - - Connection object - - - \ArangoDBClient\Connection - - - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - + + The name of the edge collection for this relation. - + string - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - + + $_fromCollections + \ArangoDBClient\EdgeDefinition::_fromCollections + array() + + An array containing the names of the vertices collections holding the start vertices. - - string + + array - - getEngine - \ArangoDBClient\AdminHandler::getEngine() - - Get the server's storage engine - This will throw if the engine data cannot be retrieved - - \ArangoDBClient\Exception - - - mixed + + $_toCollections + \ArangoDBClient\EdgeDefinition::_toCollections + array() + + An array containing the names of the vertices collections holding the end vertices. + + + array - - - - getServerVersion - \ArangoDBClient\AdminHandler::getServerVersion() - - Get the server version - This will throw if the version cannot be retrieved - - boolean + + + __construct + \ArangoDBClient\EdgeDefinition::__construct() + + Constructs an new edge definition + + + string - - \ArangoDBClient\Exception + + array + string - + + array string - + - $details - false - boolean + $relation + null + string + + + $fromCollections + array() + array|string + + + $toCollections + array() + array|string - - getServerRole - \ArangoDBClient\AdminHandler::getServerRole() - - Get the server role - This will throw if the role cannot be retrieved - - \ArangoDBClient\Exception - - + + setRelation + \ArangoDBClient\EdgeDefinition::setRelation() + + Set the relation of the edge definition + + string - - - - - getServerTime - \ArangoDBClient\AdminHandler::getServerTime() - - Get the server time - This will throw if the time cannot be retrieved - - \ArangoDBClient\Exception - - - double - - - - - - getServerLog - \ArangoDBClient\AdminHandler::getServerLog() - - Get the server log - This will throw if the log cannot be retrieved - - \ArangoDBClient\Exception - - - array - - - array - - + - $options - array() - array + $relation + + string - - reloadServerRouting - \ArangoDBClient\AdminHandler::reloadServerRouting() - - Reload the server's routing information -The call triggers a reload of the routing information from the _routing collection - This will throw if the routing cannot be reloaded - - \ArangoDBClient\Exception - - - boolean + + getRelation + \ArangoDBClient\EdgeDefinition::getRelation() + + Get the relation of the edge definition. + + + string - + - - getServerStatistics - \ArangoDBClient\AdminHandler::getServerStatistics() - - Get the server statistics -Returns the statistics information. The returned objects contains the statistics figures, grouped together -according to the description returned by _admin/statistics-description. - For instance, to access a figure userTime from the group system, you first select the sub-object -describing the group stored in system and in that sub-object the value for userTime is stored in the -attribute of the same name.In case of a distribution, the returned object contains the total count in count -and the distribution list in counts. -For more information on the statistics returned, please lookup the statistics interface description at - - - \ArangoDBClient\Exception - - + + getToCollections + \ArangoDBClient\EdgeDefinition::getToCollections() + + Get the 'to' collections of the graph. + + array - - + - - getServerStatisticsDescription - \ArangoDBClient\AdminHandler::getServerStatisticsDescription() - - Returns a description of the statistics returned by getServerStatistics(). - The returned objects contains a list of statistics groups in the attribute groups -and a list of statistics figures in the attribute figures. -For more information on the statistics returned, please lookup the statistics interface description at - - - \ArangoDBClient\Exception - - - array - - + + getFromCollections + \ArangoDBClient\EdgeDefinition::getFromCollections() + + Get the 'from' collections of the graph. + + array - - + - - $options - array() - array - - - __construct - \ArangoDBClient\Handler::__construct() - - Construct a new handler + + addToCollection + \ArangoDBClient\EdgeDefinition::addToCollection() + + Add a 'to' collections of the graph. - - \ArangoDBClient\Connection + + string + - $connection + $toCollection - \ArangoDBClient\Connection + string - \ArangoDBClient\Handler - - - getConnection - \ArangoDBClient\Handler::getConnection() - - Return the connection object - - - \ArangoDBClient\Connection - - - \ArangoDBClient\Handler - - getConnectionOption - \ArangoDBClient\Handler::getConnectionOption() - - Return a connection option -This is a convenience function that calls json_encode_wrapper on the connection + + addFromCollection + \ArangoDBClient\EdgeDefinition::addFromCollection() + + Add a 'from' collections of the graph. - - - mixed - - - \ArangoDBClient\ClientException + + string + - $optionName + $fromCollection - + string - \ArangoDBClient\Handler - - json_encode_wrapper - \ArangoDBClient\Handler::json_encode_wrapper() - - Return a json encoded string for the array passed. - This is a convenience function that calls json_encode_wrapper on the connection - + + clearToCollection + \ArangoDBClient\EdgeDefinition::clearToCollection() + + Resets the 'to' collections of the graph. + + + + + + clearFromCollection + \ArangoDBClient\EdgeDefinition::clearFromCollection() + + Resets the 'from' collections of the graph. + + + + + + transformToArray + \ArangoDBClient\EdgeDefinition::transformToArray() + + Transforms an edge definition to an array. + + array - + + + + + createUndirectedRelation + \ArangoDBClient\EdgeDefinition::createUndirectedRelation() + + Constructs an undirected relation. This relation is an edge definition where the edges can start and end +in any vertex from the collection list. + + string - - \ArangoDBClient\ClientException + + array + + \ArangoDBClient\EdgeDefinition + + - $body + $relation + + string + + + $vertexCollections array - \ArangoDBClient\Handler - - includeOptionsInBody - \ArangoDBClient\Handler::includeOptionsInBody() - - Helper function that runs through the options given and includes them into the parameters array given. - Only options that are set in $includeArray will be included. -This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - - array + + createDirectedRelation + \ArangoDBClient\EdgeDefinition::createDirectedRelation() + + Constructs a directed relation. This relation is an edge definition where the edges can start only in the +vertices defined in 'fromCollections' and end in vertices defined in 'toCollections'. + + + string - + array + string - + array + string - - array + + \ArangoDBClient\EdgeDefinition + - $options + $relation - array + string - $body + $fromCollections - array + array|string - $includeArray - array() - array + $toCollections + + array|string - \ArangoDBClient\Handler - - makeCollection - \ArangoDBClient\Handler::makeCollection() - - Turn a value into a collection name + + eJztWE1v4zYQvftXzCGAnMBx2qCn7Ec3m+xmj4tt2ksSGLRE22ppSqCobI1t/3uHFEWRlGRL2aS91AgQm0POzJs3M+Lo9c/5Jp9Mzk5OJnACl4LwdXb9Hj5/+gwxSymXF1CkfM0oJFlcbnEB96mt73IS/0HWFMCeutIHtJCUcpMJlMFHlomUcHhPhKSs0NI4y3ciXW8kXNlv5z/8+NMMJO5dU17AzXb5aYZilq05ncENFVvCd7VtdClWlgHO5+e4cjaZcLKlBfpEA3deWXC/EVZSyJa/01iCoLmgBcoRHKB7NEEo13SV8lSmGZ/raJjlxC5DnHFJUvSP4FfGUJNeJfg1gUhQRtRCBDKDQmaCgtxQrQRP8EQp3ZZMpjnG85EKmcYocBRpS6gp5RCtRLa9sqIiUgogkpm7NjcBeb0Ubwfx0g5czEhRwAd0sUE/+TZRW3Tc1OcEbhGGijBkKwvJdXyFZMtNWkAdgrk5WSt490gEhkSocO9RZLaf6f+5yCQuYzyOFrVepDNwDVkiQpBdzY2yII27RW2mI9gFbDKW1LsLiflpt3V6X1nx1PqnhuAIWIU3cPfwUpgoJsxYRO6ZIXi8fOxBc4UiKcpYqiIATr+GZRX6lhNBtnW2VJ+jOgHMbzj10shKp+pXyRMq2E6dDvLreB4Y0SH4y5g6Ctk5xTpnaSGVGTfKGIHHtImzru8gF7AgSA2hJoXUvdSpHIViv1N+iGGUUx6dT3HJehZ0DldosqJcsjSGVckrLYtFXPM+bdh7A7xkbNYOtUqdWQhWLR5r7VVH0pmg+szp24Wj8ijoDnpb28BUx/W4JXrl6A5i7RzyRK4h40/b3j471Zm2udCM2v13q6J+odJPe7ebDqyrhpNT21vCchqUBd30F1R+MVoa+sdx2Y39Zhj2luuCylJwg/4JgNYOoBCH0R3CsRD6MODjPPJq2GBZC5Jv+hDohHwagFs3uQ6hGJSJFonK9X8Vy0e/uA6h6azFNp7LJMGeOI4Xv6zcsHWUFkkSfHA2ur+jxFCVS+jUM91Xah6rdw9hyzkQl5Es+5HxKXjx2PgJMg3M98UnyJMqQv5iX4y+4ECBd5zxhT0cVswoER7pg3g2F7PDbo/kd6TjASPjKnYvhlscdQocQraFHeacqQ2nMWJ6zXM3Ilkbvs0ulYoOPuodNPmQgP9pILW33kUNDVFVpzou3nOo/7Bm8sHaaQ63+ma/DkziB8fXRkfwHHFuQ5ZDV1Pvc9CfDPDanopqsLAXEJw8nakS0k5+v26oN2rHhJvruJqZqRq8K3s4VxO+0zdi+ieoEOlTzt1XXawPtLFwEnneWQRZqNz7vjnEAO+f/wxRweA/uADQivTqW1Ai6a+Wwfbdb9YBrKcDqBHRd2y/mk7Vg5IOnj3jMs52Ks9QVhu0A9jB1zuKMRR2Hmi9+dmTo6ac/5+Z/9uZ+UVq7HpfhQVkhAP10+rtkFJbafinXycuCEtJMfVVXlxo2Qyi+/ot7715Q7m897dGqPIfNEzqrA== + + + + ArangoDB PHP client: client exception + + + + + + + \ArangoDBClient\Exception + ClientException + \ArangoDBClient\ClientException + + Client-Exception + This exception type will be thrown by the client when there is an error +on the client side, i.e. something the server is not involved in.<br> +<br> + + + + + + $enableLogging + \ArangoDBClient\Exception::enableLogging + false + + - - \ArangoDBClient\ClientException - - - mixed - - + + + + __toString + \ArangoDBClient\ClientException::__toString() + + Return a string representation of the exception + + + string - - $value - - mixed - - \ArangoDBClient\Handler - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use + + __construct + \ArangoDBClient\Exception::__construct() + + Exception constructor. - + string - - \ArangoDBClient\DocumentClassable + + integer + + + \Exception - $class - + $message + '' string - \ArangoDBClient\DocumentClassable + + $code + 0 + integer + + + $previous + null + \Exception + + \ArangoDBClient\Exception - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use + + enableLogging + \ArangoDBClient\Exception::enableLogging() + + Turn on exception logging - - string - - - \ArangoDBClient\DocumentClassable - - - $class - - string - - \ArangoDBClient\DocumentClassable + \ArangoDBClient\Exception + + + disableLogging + \ArangoDBClient\Exception::disableLogging() + + Turn off exception logging + + + \ArangoDBClient\Exception - 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 - + - ArangoDB PHP client: document handler + ArangoDB PHP client: export - - + - - \ArangoDBClient\DocumentHandler - EdgeHandler - \ArangoDBClient\EdgeHandler - - A handler that manages edges - An edge-document handler that fetches edges from the server and -persists them on the server. It does so by issuing the -appropriate HTTP requests to the server. - - - + + + Export + \ArangoDBClient\Export + + Collection export + + + - - ENTRY_DOCUMENTS - \ArangoDBClient\EdgeHandler::ENTRY_DOCUMENTS - 'edge' - - documents array index - - - - - - ENTRY_EDGES - \ArangoDBClient\EdgeHandler::ENTRY_EDGES - 'edges' - - edges array index - - - - - OPTION_COLLECTION - \ArangoDBClient\EdgeHandler::OPTION_COLLECTION - 'collection' - - collection parameter + + ENTRY_COUNT + \ArangoDBClient\Export::ENTRY_COUNT + 'count' + + Count option index - - - OPTION_EXAMPLE - \ArangoDBClient\EdgeHandler::OPTION_EXAMPLE - 'example' - - example parameter + + ENTRY_BATCHSIZE + \ArangoDBClient\Export::ENTRY_BATCHSIZE + 'batchSize' + + Batch size option index - - - OPTION_FROM - \ArangoDBClient\EdgeHandler::OPTION_FROM - 'from' - - example parameter + + ENTRY_FLUSH + \ArangoDBClient\Export::ENTRY_FLUSH + 'flush' + + Flush option index - - OPTION_TO - \ArangoDBClient\EdgeHandler::OPTION_TO - 'to' - - example parameter + + ENTRY_RESTRICT + \ArangoDBClient\Export::ENTRY_RESTRICT + 'restrict' + + Export restrictions - - OPTION_VERTEX - \ArangoDBClient\EdgeHandler::OPTION_VERTEX - 'vertex' - - vertex parameter + + ENTRY_LIMIT + \ArangoDBClient\Export::ENTRY_LIMIT + 'limit' + + Optional limit for the number of documents - - OPTION_DIRECTION - \ArangoDBClient\EdgeHandler::OPTION_DIRECTION - 'direction' - - direction parameter + + $_connection + \ArangoDBClient\Export::_connection + + + The connection object + + \ArangoDBClient\Connection + - - - ENTRY_DOCUMENTS - \ArangoDBClient\DocumentHandler::ENTRY_DOCUMENTS - 'documents' - - documents array index + + + $_collection + \ArangoDBClient\Export::_collection + + + The collection name or collection object + + mixed + - - - OPTION_COLLECTION - \ArangoDBClient\DocumentHandler::OPTION_COLLECTION - 'collection' - - collection parameter + + + $_batchSize + \ArangoDBClient\Export::_batchSize + + + The current batch size (number of result documents retrieved per round-trip) + + mixed + - - - OPTION_EXAMPLE - \ArangoDBClient\DocumentHandler::OPTION_EXAMPLE - 'example' - - example parameter + + + $_flat + \ArangoDBClient\Export::_flat + false + + "flat" flag (if set, the query results will be treated as a simple array, not documents) + + boolean + - - - OPTION_OVERWRITE - \ArangoDBClient\DocumentHandler::OPTION_OVERWRITE - 'overwrite' - - overwrite option + + + $_flush + \ArangoDBClient\Export::_flush + true + + Flush flag (if set, then all documents from the collection that are currently only +in the write-ahead log (WAL) will be moved to the collection's datafiles. This may cause +an initial delay in the export, but will lead to the documents in the WAL not being +excluded from the export run. If the flush flag is set to false, the documents still +in the WAL may be missing in the export result. + + boolean + - - - OPTION_RETURN_OLD - \ArangoDBClient\DocumentHandler::OPTION_RETURN_OLD - 'returnOld' - - option for returning the old document + + + $_type + \ArangoDBClient\Export::_type + + + The underlying collection type - - - OPTION_RETURN_NEW - \ArangoDBClient\DocumentHandler::OPTION_RETURN_NEW - 'returnNew' - - option for returning the new document + + + $_restrictions + \ArangoDBClient\Export::_restrictions + + + export restrictions - either null for no restrictions or an array with a "type" and a "fields" index + + mixed + - - - $_connection - \ArangoDBClient\Handler::_connection - - - Connection object + + + $_limit + \ArangoDBClient\Export::_limit + 0 + + optional limit for export - if specified and positive, will cap the amount of documents in the cursor to +the specified value - - \ArangoDBClient\Connection + + integer @@ -21966,3038 +23316,5301 @@ appropriate HTTP requests to the server. - + __construct - \ArangoDBClient\EdgeHandler::__construct() - - Construct a new handler + \ArangoDBClient\Export::__construct() + + Initialize the export - + + \ArangoDBClient\Exception + + \ArangoDBClient\Connection + + string + + + array + $connection \ArangoDBClient\Connection - - - createFromArrayWithContext - \ArangoDBClient\EdgeHandler::createFromArrayWithContext() - - Intermediate function to call the createFromArray function from the right context - - - - - \ArangoDBClient\Edge - - - \ArangoDBClient\ClientException - - - - $data + $collection - + string - $options - - - - - - saveEdge - \ArangoDBClient\EdgeHandler::saveEdge() - - save an edge to an edge-collection - This will save the edge to the collection and return the edges-document's id - -This will throw if the document cannot be saved - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - mixed - - - mixed - - - array - - - mixed - - - - - $collection - - mixed - - - $from - - mixed - - - $to - - mixed - - - $document - - mixed - - - $options + $data array() array - - edges - \ArangoDBClient\EdgeHandler::edges() - - Get connected edges for a given vertex + + getConnection + \ArangoDBClient\Export::getConnection() + + Return the connection object - - \ArangoDBClient\Exception + + \ArangoDBClient\Connection - - mixed + + + + execute + \ArangoDBClient\Export::execute() + + Execute the export + This will return the results as a Cursor. The cursor can then be used to iterate the results. + + \ArangoDBClient\Exception - - mixed + + \ArangoDBClient\ExportCursor - - string + + + + setBatchSize + \ArangoDBClient\Export::setBatchSize() + + Set the batch size for the export + The batch size is the number of results to be transferred +in one server round-trip. If an export produces more documents +than the batch size, it creates a server-side cursor that +provides the additional results. + +The server-side cursor can be accessed by the client with subsequent HTTP requests. + + \ArangoDBClient\ClientException - - array + + integer - - array + + void - - $collection - - mixed - - - $vertexHandle + $value - mixed - - - $direction - 'any' - string - - - $options - array() - array + integer - - inEdges - \ArangoDBClient\EdgeHandler::inEdges() - - Get connected inbound edges for a given vertex + + getBatchSize + \ArangoDBClient\Export::getBatchSize() + + Get the batch size for the export - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - array + + integer - - $collection - - mixed - - - $vertexHandle - - mixed - - - outEdges - \ArangoDBClient\EdgeHandler::outEdges() - - Get connected outbound edges for a given vertex + + getCursorOptions + \ArangoDBClient\Export::getCursorOptions() + + Return an array of cursor options - - \ArangoDBClient\Exception - - - mixed - - - mixed - - + array - - $collection - - mixed - - - $vertexHandle - - mixed - - - createCollectionIfOptions - \ArangoDBClient\EdgeHandler::createCollectionIfOptions() - - + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use - - - array + + string + + + \ArangoDBClient\DocumentClassable - - $collection - - - - - $options + $class - array + string + \ArangoDBClient\DocumentClassable - - get - \ArangoDBClient\DocumentHandler::get() - - Get a single document from a collection - Alias method for getById() - - \ArangoDBClient\Exception - - + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use + + string - - mixed - - - array - - - \ArangoDBClient\Document + + \ArangoDBClient\DocumentClassable - $collection + $class string - - $documentId - - mixed - - - $options - array() - array - - \ArangoDBClient\DocumentHandler + \ArangoDBClient\DocumentClassable - - has - \ArangoDBClient\DocumentHandler::has() - - Check if a document exists - This will call self::get() internally and checks if there -was an exception thrown which represents an 404 request. - - \ArangoDBClient\Exception - - - string - - - mixed - - - boolean - - - - $collection - - string - - - $documentId - - mixed - - \ArangoDBClient\DocumentHandler - - - getById - \ArangoDBClient\DocumentHandler::getById() - - Get a single document from a collection - This will throw if the document cannot be fetched from the server. - - \ArangoDBClient\Exception - - - string + + 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 + + + + ArangoDB PHP client: value validator + + + + + + + + ValueValidator + \ArangoDBClient\ValueValidator + + A simple validator for values to be stored in the database + + + + + + validate + \ArangoDBClient\ValueValidator::validate() + + Validate the value of a variable + Allowed value types are string, integer, double and boolean. Arrays are also allowed if they contain only one of the former types. + + \ArangoDBClient\ClientException - + mixed - - array - - - \ArangoDBClient\Document + + void - $collection - - string - - - $documentId + $value mixed - - $options - array() - array - - \ArangoDBClient\DocumentHandler - - getHead - \ArangoDBClient\DocumentHandler::getHead() - - Gets information about a single documents from a collection - This will throw if the document cannot be fetched from the server - - \ArangoDBClient\Exception - - - string - - - mixed - - - boolean - - - string - - - array - + + eJyNVE1v2zAMvftX8FAgWZAlXY5Jg6XrhnY7FRiQU4CAdmhbqCwZktzUWPvfR8kfSYxgmAF/QHzie4+kfPe1zMsomk8mEUzg3qDK9Pdv8Pz0DIkUpNwSXlFW5J/igE4bxnnopsTkBTMC6Hc9hA0hiJXLteEY/EIFvx1RgUqFUKLL2ogsd/DQfy1uvyym4IzghMrCYxE/TTksdaZoCo9keHfNu+dRpLAgy9w0oF2dTIAVRSnPJEPKd7BhwWmICSyv0gGEApcTMAhjtDS0dsWYFSrxnm9ni6AnkWgtbH3ubV+hP5F3HuT4awJtiAJbU0+dAvInW44ltbgOfi+lPrK8BunqknWj8aqNUNmUZTvKyEzhoCveDagOEGstCdWMRRusGzxKq/nRJBOpZ68h0cohG9dK1vwISrwsrlFBpmGbDQRtXG700UJTiB9vCZVOaDVElWiwgEK8Md1NI/5zZ0J37Ria3RhylVHwqsWB4UchJQQ6r5iHR6iw8awYICyUXHY6tDnm4V1yLUTCRULHr7RSidfY044bRZ8CtumQv5hkLOy+KW2Hgfd3JtlznQcrqdQ4XPOVP19SFTtYr9fQrZ3IwljMexNtay7CTTVW/dpHNJSKvsEd4ZXsRWUdJDklL54ASFLBTbNd4wd83HbCJIc2IaCFG1vF22vS/WVJpsvlqag9dnUBPZP9H65abqG4eXy+eCL58EsKDRyK+Eeqs9K2U9OHmolSdBzO8Hj0sx2wWPAxCiNMjtr/xai19RExTTjre8aiHV+e+OUyxKYw2nU/sV3784h3l1Cf8S+uaaQg + + + + ArangoDB PHP client: graph handler + + + + + + + + + + \ArangoDBClient\Handler + GraphHandler + \ArangoDBClient\GraphHandler + + A handler that manages graphs. + + + + + + + ENTRY_GRAPH + \ArangoDBClient\GraphHandler::ENTRY_GRAPH + 'graph' + + documents array index + - - $collection - - string - - - $documentId - - mixed - - - $revision - null - string - - - $ifMatch - null - boolean - - \ArangoDBClient\DocumentHandler - - - createFromArrayWithContext - \ArangoDBClient\DocumentHandler::createFromArrayWithContext() - - Intermediate function to call the createFromArray function from the right context + + + OPTION_REVISION + \ArangoDBClient\GraphHandler::OPTION_REVISION + 'revision' + + conditional update of edges or vertices - - - - \ArangoDBClient\Document - - - \ArangoDBClient\ClientException - - - $data - - - - - $options - - - - \ArangoDBClient\DocumentHandler - - - store - \ArangoDBClient\DocumentHandler::store() - - Store a document to a collection - This is an alias/shortcut to save() and replace(). Instead of having to determine which of the 3 functions to use, -simply pass the document to store() and it will figure out which one to call. - -This will throw if the document cannot be saved or replaced. - - \ArangoDBClient\Exception - - - \ArangoDBClient\Document - - - mixed - - - array - - - mixed - - + + + OPTION_VERTICES + \ArangoDBClient\GraphHandler::OPTION_VERTICES + 'vertices' + + vertex parameter + - - $document - - \ArangoDBClient\Document - - - $collection - null - mixed - - - $options - array() - array - - \ArangoDBClient\DocumentHandler - - - save - \ArangoDBClient\DocumentHandler::save() - - save a document to a collection - This will add the document to the collection and return the document's id - -This will throw if the document cannot be saved - - \ArangoDBClient\Exception - - - mixed - - - \ArangoDBClient\Document - array - - - array - - - mixed - - + + + OPTION_EDGES + \ArangoDBClient\GraphHandler::OPTION_EDGES + 'edges' + + direction parameter + - - $collection - - mixed - - - $document - - \ArangoDBClient\Document|array - - - $options - array() - array - - \ArangoDBClient\DocumentHandler - - - insert - \ArangoDBClient\DocumentHandler::insert() - - Insert a document into a collection - This is an alias for save(). + + + OPTION_KEY + \ArangoDBClient\GraphHandler::OPTION_KEY + '_key' + + direction parameter + + + + + OPTION_COLLECTION + \ArangoDBClient\GraphHandler::OPTION_COLLECTION + 'collection' + + collection parameter + + + + + OPTION_COLLECTIONS + \ArangoDBClient\GraphHandler::OPTION_COLLECTIONS + 'collections' + + collections parameter + + + + + KEY_FROM + \ArangoDBClient\GraphHandler::KEY_FROM + '_from' + + example parameter + + + + + KEY_TO + \ArangoDBClient\GraphHandler::KEY_TO + '_to' + + example parameter + + + + + OPTION_NAME + \ArangoDBClient\GraphHandler::OPTION_NAME + 'name' + + name parameter + + + + + OPTION_EDGE_DEFINITION + \ArangoDBClient\GraphHandler::OPTION_EDGE_DEFINITION + 'edgeDefinition' + + edge definition parameter + + + + + OPTION_EDGE_DEFINITIONS + \ArangoDBClient\GraphHandler::OPTION_EDGE_DEFINITIONS + 'edgeDefinitions' + + edge definitions parameter + + + + + OPTION_ORPHAN_COLLECTIONS + \ArangoDBClient\GraphHandler::OPTION_ORPHAN_COLLECTIONS + 'orphanCollections' + + orphan collection parameter + + + + + OPTION_DROP_COLLECTION + \ArangoDBClient\GraphHandler::OPTION_DROP_COLLECTION + 'dropCollection' + + drop collection + + + + + $cache + \ArangoDBClient\GraphHandler::cache + + + GraphHandler cache store + + + + + $cacheEnabled + \ArangoDBClient\GraphHandler::cacheEnabled + false + + + + + + + + $batchsize + \ArangoDBClient\GraphHandler::batchsize + + + batchsize + + + + + $count + \ArangoDBClient\GraphHandler::count + + + count + + + + + $limit + \ArangoDBClient\GraphHandler::limit + + + limit + + + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object + + + \ArangoDBClient\Connection + + + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + + + string + + + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + + string + + + + + createGraph + \ArangoDBClient\GraphHandler::createGraph() + + Create a graph + This will create a graph using the given graph object and return an array of the created graph object's attributes.<br><br> + + \ArangoDBClient\Exception + + + \ArangoDBClient\Graph + + + array + + - $collection - - - - - $document + $graph - - - - $options - array() - array + \ArangoDBClient\Graph - \ArangoDBClient\DocumentHandler - - update - \ArangoDBClient\DocumentHandler::update() - - Update an existing document in a collection, identified by the including _id and optionally _rev in the patch document. - Attention - The behavior of this method has changed since version 1.1 - -This will update the document on the server - -This will throw if the document cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the document to-be-replaced is the same as the one given. - - \ArangoDBClient\Exception - - - \ArangoDBClient\Document + + getGraph + \ArangoDBClient\GraphHandler::getGraph() + + Get a graph + This will get a graph.<br><br> + + String - + array - - boolean + + \ArangoDBClient\Graph + false + + + \ArangoDBClient\ClientException + - $document + $graph - \ArangoDBClient\Document + String $options array() array - \ArangoDBClient\DocumentHandler - - updateById - \ArangoDBClient\DocumentHandler::updateById() - - Update an existing document in a collection, identified by collection id and document id -Attention - The behavior of this method has changed since version 1.1 - This will update the document on the server - -This will throw if the document cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the document to-be-updated is the same as the one given. - - \ArangoDBClient\Exception - - - string - - - mixed - - - \ArangoDBClient\Document - - - array - - - boolean + + setBatchsize + \ArangoDBClient\GraphHandler::setBatchsize() + + Sets the batchsize for any method creating a cursor. + Will be reset after the cursor has been created. + + integer - $collection + $batchsize - string + integer + + + setCount + \ArangoDBClient\GraphHandler::setCount() + + Sets the count for any method creating a cursor. + Will be reset after the cursor has been created. + + integer + + - $documentId + $count - mixed + integer + + + setLimit + \ArangoDBClient\GraphHandler::setLimit() + + Sets the limit for any method creating a cursor. + Will be reset after the cursor has been created. + + integer + + - $document + $limit - \ArangoDBClient\Document - - - $options - array() - array + integer - \ArangoDBClient\DocumentHandler - - replace - \ArangoDBClient\DocumentHandler::replace() - - Replace an existing document in a collection, identified by the document itself - This will update the document on the server - -This will throw if the document cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the to-be-replaced document is the same as the one given. - + + properties + \ArangoDBClient\GraphHandler::properties() + + Get a graph's properties<br><br> + + \ArangoDBClient\Exception - - \ArangoDBClient\Document - - - array + + mixed - + boolean + - $document + $graph - \ArangoDBClient\Document - - - $options - array() - array + mixed - \ArangoDBClient\DocumentHandler - - replaceById - \ArangoDBClient\DocumentHandler::replaceById() - - Replace an existing document in a collection, identified by collection id and document id - This will update the document on the server - -This will throw if the document cannot be Replaced - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the to-be-replaced document is the same as the one given. - + + dropGraph + \ArangoDBClient\GraphHandler::dropGraph() + + Drop a graph and remove all its vertices and edges, also drops vertex and edge collections<br><br> + + \ArangoDBClient\Exception - - mixed - - + mixed - - \ArangoDBClient\Document - - - array + + boolean - + boolean + - $collection - - mixed - - - $documentId + $graph mixed - $document - - \ArangoDBClient\Document - - - $options - array() - array + $dropCollections + true + boolean - \ArangoDBClient\DocumentHandler - - remove - \ArangoDBClient\DocumentHandler::remove() - - Remove a document from a collection, identified by the document itself - - + + addOrphanCollection + \ArangoDBClient\GraphHandler::addOrphanCollection() + + add an orphan collection to the graph. + This will add a further orphan collection to the graph.<br><br> + \ArangoDBClient\Exception - - \ArangoDBClient\Document + + mixed - - array + + string - - boolean + + \ArangoDBClient\Graph + - $document + $graph - \ArangoDBClient\Document + mixed - $options - array() - array + $orphanCollection + + string - \ArangoDBClient\DocumentHandler - - removeById - \ArangoDBClient\DocumentHandler::removeById() - - Remove a document from a collection, identified by the collection id and document id - - + + deleteOrphanCollection + \ArangoDBClient\GraphHandler::deleteOrphanCollection() + + deletes an orphan collection from the graph. + This will delete an orphan collection from the graph.<br><br> + \ArangoDBClient\Exception - - mixed - - - mixed - - + mixed - - array + + string - + boolean + + \ArangoDBClient\Graph + + - $collection + $graph mixed - $documentId + $orphanCollection - mixed - - - $revision - null - mixed + string - $options - array() - array + $dropCollection + false + boolean - \ArangoDBClient\DocumentHandler - - getDocumentId - \ArangoDBClient\DocumentHandler::getDocumentId() - - Helper function to get a document id from a document or a document id value - - - \ArangoDBClient\ClientException - - + + getVertexCollections + \ArangoDBClient\GraphHandler::getVertexCollections() + + gets all vertex collection from the graph. + This will get all vertex collection (orphans and used in edge definitions) from the graph.<br><br> + +If this method or any method that calls this method is used in batch mode and caching is off,<br> +then for each call, this method will make an out of batch API call to the db in order to get the appropriate collections.<br><br> + +If caching is on, then the GraphHandler will only call the DB API once for the chosen graph, and return data from cache for the following calls.<br> + mixed - - mixed + + array + + + array + + + \ArangoDBClient\ClientException@since - $document + $graph mixed - \ArangoDBClient\DocumentHandler + + $options + array() + array + - - getRevision - \ArangoDBClient\DocumentHandler::getRevision() - - Helper function to get a document id from a document or a document id value - - - \ArangoDBClient\ClientException + + addEdgeDefinition + \ArangoDBClient\GraphHandler::addEdgeDefinition() + + adds an edge definition to the graph. + This will add a further edge definition to the graph.<br><br> + + \ArangoDBClient\Exception - + mixed - - mixed + + \ArangoDBClient\EdgeDefinition + + + \ArangoDBClient\Graph + - $document + $graph mixed - \ArangoDBClient\DocumentHandler + + $edgeDefinition + + \ArangoDBClient\EdgeDefinition + - - createCollectionIfOptions - \ArangoDBClient\DocumentHandler::createCollectionIfOptions() - - - - - - array + + deleteEdgeDefinition + \ArangoDBClient\GraphHandler::deleteEdgeDefinition() + + deletes an edge definition from the graph. + This will delete an edge definition from the graph.<br><br> + + \ArangoDBClient\Exception + + + mixed + + + string + + + boolean + + + \ArangoDBClient\Graph + - $collection + $graph - + mixed - $options + $edgeDefinition - array + string - \ArangoDBClient\DocumentHandler - - - __construct - \ArangoDBClient\Handler::__construct() - - Construct a new handler - - - \ArangoDBClient\Connection - - - $connection - - \ArangoDBClient\Connection + $dropCollection + false + boolean - \ArangoDBClient\Handler - - getConnection - \ArangoDBClient\Handler::getConnection() - - Return the connection object - - - \ArangoDBClient\Connection + + getEdgeCollections + \ArangoDBClient\GraphHandler::getEdgeCollections() + + gets all edge collections from the graph. + This will get all edge collections from the graph.<br><br> + +If this method or any method that calls this method is used in batch mode and caching is off,<br> +then for each call, this method will make an out of batch API call to the db in order to get the appropriate collections.<br><br> + +If caching is on, then the GraphHandler will only call the DB API once for the chosen graph, and return data from cache for the following calls.<br> + + \ArangoDBClient\Exception - - \ArangoDBClient\Handler - - - getConnectionOption - \ArangoDBClient\Handler::getConnectionOption() - - Return a connection option -This is a convenience function that calls json_encode_wrapper on the connection - - - + mixed - - \ArangoDBClient\ClientException + + array + - $optionName + $graph - + mixed - \ArangoDBClient\Handler - - json_encode_wrapper - \ArangoDBClient\Handler::json_encode_wrapper() - - Return a json encoded string for the array passed. - This is a convenience function that calls json_encode_wrapper on the connection - - array + + replaceEdgeDefinition + \ArangoDBClient\GraphHandler::replaceEdgeDefinition() + + replaces an edge definition of the graph. + This will replace an edge definition in the graph.<br><br> + + \ArangoDBClient\Exception - - string + + mixed - - \ArangoDBClient\ClientException + + \ArangoDBClient\EdgeDefinition + + + \ArangoDBClient\Graph + - $body + $graph - array + mixed + + + $edgeDefinition + + \ArangoDBClient\EdgeDefinition - \ArangoDBClient\Handler - - includeOptionsInBody - \ArangoDBClient\Handler::includeOptionsInBody() - - Helper function that runs through the options given and includes them into the parameters array given. - Only options that are set in $includeArray will be included. -This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - - array + + saveVertex + \ArangoDBClient\GraphHandler::saveVertex() + + save a vertex to a graph + This will add the vertex-document to the graph and return the vertex id + +This will throw if the vertex cannot be saved<br><br> + + \ArangoDBClient\Exception - - array + + mixed - - array + + mixed - - array + + string + + + string + - $options + $graph - array + mixed - $body + $document - array + mixed - $includeArray - array() - array + $collection + null + string - \ArangoDBClient\Handler - - makeCollection - \ArangoDBClient\Handler::makeCollection() - - Turn a value into a collection name - - - \ArangoDBClient\ClientException + + getVertex + \ArangoDBClient\GraphHandler::getVertex() + + Get a single vertex from a graph + This will throw if the vertex cannot be fetched from the server<br><br> + + \ArangoDBClient\Exception + + + mixed - + mixed - + + array + + string + + \ArangoDBClient\Document + + - $value + $graph mixed - \ArangoDBClient\Handler - - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use - - - string - - - \ArangoDBClient\DocumentClassable - - - $class + $vertexId + mixed + + + $options + array() + array + + + $collection + null string - \ArangoDBClient\DocumentClassable - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use - - - string + + hasVertex + \ArangoDBClient\GraphHandler::hasVertex() + + Check if a vertex exists + This will call self::getVertex() internally and checks if there +was an exception thrown which represents an 404 request. + + \ArangoDBClient\Exception - - \ArangoDBClient\DocumentClassable + + mixed + + + mixed + + + boolean - $class + $graph - string + mixed + + + $vertexId + + mixed - \ArangoDBClient\DocumentClassable - - - No summary for method createCollectionIfOptions() - - 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 - - - - ArangoDB PHP client: export - - - - - - - - Export - \ArangoDBClient\Export - - Collection export - - - - - - ENTRY_COUNT - \ArangoDBClient\Export::ENTRY_COUNT - 'count' - - Count option index - - - - - ENTRY_BATCHSIZE - \ArangoDBClient\Export::ENTRY_BATCHSIZE - 'batchSize' - - Batch size option index - - - - - ENTRY_FLUSH - \ArangoDBClient\Export::ENTRY_FLUSH - 'flush' - - Flush option index - - - - - ENTRY_RESTRICT - \ArangoDBClient\Export::ENTRY_RESTRICT - 'restrict' - - Export restrictions - - - - - ENTRY_LIMIT - \ArangoDBClient\Export::ENTRY_LIMIT - 'limit' - - Optional limit for the number of documents - - - - - $_connection - \ArangoDBClient\Export::_connection - - - The connection object - - - \ArangoDBClient\Connection + + replaceVertex + \ArangoDBClient\GraphHandler::replaceVertex() + + Replace an existing vertex in a graph, identified graph name and vertex id + This will update the vertex on the server + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the to-be-replaced vertex is the same as the one given.<br><br> + + \ArangoDBClient\Exception - - - - $_collection - \ArangoDBClient\Export::_collection - - - The collection name or collection object - - + mixed - - - - $_batchSize - \ArangoDBClient\Export::_batchSize - - - The current batch size (number of result documents retrieved per round-trip) - - + mixed - - - - $_flat - \ArangoDBClient\Export::_flat - false - - "flat" flag (if set, the query results will be treated as a simple array, not documents) - - - boolean - - - - - $_flush - \ArangoDBClient\Export::_flush - true - - Flush flag (if set, then all documents from the collection that are currently only -in the write-ahead log (WAL) will be moved to the collection's datafiles. This may cause -an initial delay in the export, but will lead to the documents in the WAL not being -excluded from the export run. If the flush flag is set to false, the documents still -in the WAL may be missing in the export result. - - - boolean + + \ArangoDBClient\Document - - - - $_type - \ArangoDBClient\Export::_type - - - The underlying collection type - - - - - $_restrictions - \ArangoDBClient\Export::_restrictions - - - export restrictions - either null for no restrictions or an array with a "type" and a "fields" index - - + mixed - - - - $_limit - \ArangoDBClient\Export::_limit - 0 - - optional limit for export - if specified and positive, will cap the amount of documents in the cursor to -the specified value - - - integer - - - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - - - + string - - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - - - - string - - - - - __construct - \ArangoDBClient\Export::__construct() - - Initialize the export - - - \ArangoDBClient\Exception - - - \ArangoDBClient\Connection - - - string - - - array + + boolean + - $connection + $graph - \ArangoDBClient\Connection + mixed - $collection + $vertexId - string + mixed - $data + $document + + \ArangoDBClient\Document + + + $options array() - array + mixed + + + $collection + null + string - - getConnection - \ArangoDBClient\Export::getConnection() - - Return the connection object - - - \ArangoDBClient\Connection - - - - - execute - \ArangoDBClient\Export::execute() - - Execute the export - This will return the results as a Cursor. The cursor can then be used to iterate the results. - + + updateVertex + \ArangoDBClient\GraphHandler::updateVertex() + + Update an existing vertex in a graph, identified by graph name and vertex id + This will update the vertex on the server + +This will throw if the vertex cannot be updated + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed vertex-document has a _rev value set, the database will check +that the revision of the to-be-replaced document is the same as the one given.<br><br> + \ArangoDBClient\Exception - - \ArangoDBClient\ExportCursor + + mixed - - - - setBatchSize - \ArangoDBClient\Export::setBatchSize() - - Set the batch size for the export - The batch size is the number of results to be transferred -in one server round-trip. If an export produces more documents -than the batch size, it creates a server-side cursor that -provides the additional results. - -The server-side cursor can be accessed by the client with subsequent HTTP requests. - - \ArangoDBClient\ClientException + + mixed - - integer + + \ArangoDBClient\Document - - void + + mixed + + + string + + boolean + + - $value + $graph - integer + mixed + + + $vertexId + + mixed + + + $document + + \ArangoDBClient\Document + + + $options + array() + mixed + + + $collection + null + string - - getBatchSize - \ArangoDBClient\Export::getBatchSize() - - Get the batch size for the export + + removeVertex + \ArangoDBClient\GraphHandler::removeVertex() + + Remove a vertex from a graph, identified by the graph name and vertex id<br><br> - - integer + + \ArangoDBClient\Exception - - - - getCursorOptions - \ArangoDBClient\Export::getCursorOptions() - - Return an array of cursor options - - - array + + mixed - - - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use - - + + mixed + + + mixed + + + mixed + + string - - \ArangoDBClient\DocumentClassable + + boolean + - $class + $graph + mixed + + + $vertexId + + mixed + + + $revision + null + mixed + + + $options + array() + mixed + + + $collection + null string - \ArangoDBClient\DocumentClassable - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use - - + + saveEdge + \ArangoDBClient\GraphHandler::saveEdge() + + save an edge to a graph + This will save the edge to the graph and return the edges-document's id + +This will throw if the edge cannot be saved<br><br> + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + mixed + + + mixed + + + mixed + + string - - \ArangoDBClient\DocumentClassable + + mixed + - $class + $graph - string + mixed - \ArangoDBClient\DocumentClassable - - - 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 - - - - ArangoDB PHP client: graph handler - - - - - - - - - + + $from + + mixed + + + $to + + mixed + + + $label + null + mixed + + + $document + + mixed + + + $collection + null + string + + + + getEdge + \ArangoDBClient\GraphHandler::getEdge() + + Get a single edge from a graph + This will throw if the edge cannot be fetched from the server<br><br> + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + array + + + string + + + \ArangoDBClient\Document + + + + + $graph + + mixed + + + $edgeId + + mixed + + + $options + array() + array + + + $collection + null + string + + + + hasEdge + \ArangoDBClient\GraphHandler::hasEdge() + + Check if an edge exists + This will call self::getEdge() internally and checks if there +was an exception thrown which represents an 404 request. + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + boolean + + + + $graph + + mixed + + + $edgeId + + mixed + + + + replaceEdge + \ArangoDBClient\GraphHandler::replaceEdge() + + Replace an existing edge in a graph, identified graph name and edge id + This will replace the edge on the server + +This will throw if the edge cannot be Replaced + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the to-be-replaced edge is the same as the one given.<br><br> + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + mixed + + + \ArangoDBClient\Edge + + + mixed + + + string + + + boolean + + + + + $graph + + mixed + + + $edgeId + + mixed + + + $label + + mixed + + + $document + + \ArangoDBClient\Edge + + + $options + array() + mixed + + + $collection + null + string + + + + updateEdge + \ArangoDBClient\GraphHandler::updateEdge() + + Update an existing edge in a graph, identified by graph name and edge id + This will update the edge on the server + +This will throw if the edge cannot be updated + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed edge-document has a _rev value set, the database will check +that the revision of the to-be-replaced document is the same as the one given.<br><br> + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + mixed + + + \ArangoDBClient\Edge + + + mixed + + + string + + + boolean + + + + + $graph + + mixed + + + $edgeId + + mixed + + + $label + + mixed + + + $document + + \ArangoDBClient\Edge + + + $options + array() + mixed + + + $collection + null + string + + + + removeEdge + \ArangoDBClient\GraphHandler::removeEdge() + + Remove a edge from a graph, identified by the graph name and edge id<br><br> + + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + mixed + + + mixed + + + string + + + boolean + + + + + $graph + + mixed + + + $edgeId + + mixed + + + $revision + null + mixed + + + $options + array() + mixed + + + $collection + null + string + + + + clearCache + \ArangoDBClient\GraphHandler::clearCache() + + Clears the GraphHandler's cache + + + \ArangoDBClient\GraphHandler + + + + + + getCacheEnabled + \ArangoDBClient\GraphHandler::getCacheEnabled() + + Checks if caching in enabled + + + boolean + + + + + setCacheEnabled + \ArangoDBClient\GraphHandler::setCacheEnabled() + + + + + boolean + + + \ArangoDBClient\GraphHandler + + + + + $useCache + + boolean + + + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler + + + \ArangoDBClient\Connection + + + + $connection + + \ArangoDBClient\Connection + + \ArangoDBClient\Handler + + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object + + + \ArangoDBClient\Connection + + + \ArangoDBClient\Handler + + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() + + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection + + + + mixed + + + \ArangoDBClient\ClientException + + + + $optionName + + + + \ArangoDBClient\Handler + + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + + array + + + string + + + \ArangoDBClient\ClientException + + + + $body + + array + + \ArangoDBClient\Handler + + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + + Helper function that runs through the options given and includes them into the parameters array given. + Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . + + array + + + array + + + array + + + array + + + + $options + + array + + + $body + + array + + + $includeArray + array() + array + + \ArangoDBClient\Handler + + + makeCollection + \ArangoDBClient\Handler::makeCollection() + + Turn a value into a collection name + + + \ArangoDBClient\ClientException + + + mixed + + + string + + + + $value + + mixed + + \ArangoDBClient\Handler + + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + + array + + + mixed + + + + $headers + + array + + + $collection + + mixed + + \ArangoDBClient\Handler + + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use + + + string + + + \ArangoDBClient\DocumentClassable + + + + $class + + string + + \ArangoDBClient\DocumentClassable + + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use + + + string + + + \ArangoDBClient\DocumentClassable + + + + $class + + string + + \ArangoDBClient\DocumentClassable + + + + No summary for method setCacheEnabled() + + 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 + + + + ArangoDB PHP client: streaming transaction collection + + + + + + + \ArangoDBClient\Collection + StreamingTransactionCollection + \ArangoDBClient\StreamingTransactionCollection + + Streaming transaction collection object + <br> + + + + + + ENTRY_ID + \ArangoDBClient\Collection::ENTRY_ID + 'id' + + Collection id index + + + + + ENTRY_NAME + \ArangoDBClient\Collection::ENTRY_NAME + 'name' + + Collection name index + + + + + ENTRY_TYPE + \ArangoDBClient\Collection::ENTRY_TYPE + 'type' + + Collection type index + + + + + ENTRY_WAIT_SYNC + \ArangoDBClient\Collection::ENTRY_WAIT_SYNC + 'waitForSync' + + Collection 'waitForSync' index + + + + + ENTRY_JOURNAL_SIZE + \ArangoDBClient\Collection::ENTRY_JOURNAL_SIZE + 'journalSize' + + Collection 'journalSize' index + + + + + ENTRY_STATUS + \ArangoDBClient\Collection::ENTRY_STATUS + 'status' + + Collection 'status' index + + + + + ENTRY_KEY_OPTIONS + \ArangoDBClient\Collection::ENTRY_KEY_OPTIONS + 'keyOptions' + + Collection 'keyOptions' index + + + + + ENTRY_IS_SYSTEM + \ArangoDBClient\Collection::ENTRY_IS_SYSTEM + 'isSystem' + + Collection 'isSystem' index + + + + + ENTRY_IS_VOLATILE + \ArangoDBClient\Collection::ENTRY_IS_VOLATILE + 'isVolatile' + + Collection 'isVolatile' index + + + + + ENTRY_DISTRIBUTE_SHARDS_LIKE + \ArangoDBClient\Collection::ENTRY_DISTRIBUTE_SHARDS_LIKE + 'distributeShardsLike' + + Collection 'distributeShardsLike' index + + + + + ENTRY_NUMBER_OF_SHARDS + \ArangoDBClient\Collection::ENTRY_NUMBER_OF_SHARDS + 'numberOfShards' + + Collection 'numberOfShards' index + + + + + ENTRY_REPLICATION_FACTOR + \ArangoDBClient\Collection::ENTRY_REPLICATION_FACTOR + 'replicationFactor' + + Collection 'replicationFactor' index + + + + + ENTRY_MIN_REPLICATION_FACTOR + \ArangoDBClient\Collection::ENTRY_MIN_REPLICATION_FACTOR + 'minReplicationFactor' + + Collection 'minReplicationFactor' index + + + + + ENTRY_SHARDING_STRATEGY + \ArangoDBClient\Collection::ENTRY_SHARDING_STRATEGY + 'shardingStrategy' + + Collection 'shardingStrategy' index + + + + + ENTRY_SHARD_KEYS + \ArangoDBClient\Collection::ENTRY_SHARD_KEYS + 'shardKeys' + + Collection 'shardKeys' index + + + + + ENTRY_SMART_JOIN_ATTRIBUTE + \ArangoDBClient\Collection::ENTRY_SMART_JOIN_ATTRIBUTE + 'smartJoinAttribute' + + Collection 'smartJoinAttribute' index + + + + + OPTION_PROPERTIES + \ArangoDBClient\Collection::OPTION_PROPERTIES + 'properties' + + properties option + + + + + TYPE_DOCUMENT + \ArangoDBClient\Collection::TYPE_DOCUMENT + 2 + + document collection type + + + + + TYPE_EDGE + \ArangoDBClient\Collection::TYPE_EDGE + 3 + + edge collection type + + + + + STATUS_NEW_BORN + \ArangoDBClient\Collection::STATUS_NEW_BORN + 1 + + New born collection + + + + + STATUS_UNLOADED + \ArangoDBClient\Collection::STATUS_UNLOADED + 2 + + Unloaded collection + + + + + STATUS_LOADED + \ArangoDBClient\Collection::STATUS_LOADED + 3 + + Loaded collection + + + + + STATUS_BEING_UNLOADED + \ArangoDBClient\Collection::STATUS_BEING_UNLOADED + 4 + + Collection being unloaded + + + + + STATUS_DELETED + \ArangoDBClient\Collection::STATUS_DELETED + 5 + + Deleted collection + + + + + $_trx + \ArangoDBClient\StreamingTransactionCollection::_trx + + + The transaction - assigned on construction + + + \ArangoDBClient\StreamingTransaction + + + + + $_name + \ArangoDBClient\StreamingTransactionCollection::_name + + + Collection name - assigned on construction + + + string + + + + + + $_mode + \ArangoDBClient\StreamingTransactionCollection::_mode + + + Lock mode for this collection, i.e. 'read', 'write' or 'exclusive' + + + string + + + + + $_id + \ArangoDBClient\Collection::_id + + + The collection id (might be NULL for new collections) + + + mixed + + + + + $_name + \ArangoDBClient\Collection::_name + + + The collection name (might be NULL for new collections) + + + string + + + + + $_type + \ArangoDBClient\Collection::_type + + + The collection type (might be NULL for new collections) + + + integer + + + + + $_waitForSync + \ArangoDBClient\Collection::_waitForSync + + + The collection waitForSync value (might be NULL for new collections) + + + boolean + + + + + $_journalSize + \ArangoDBClient\Collection::_journalSize + + + The collection journalSize value (might be NULL for new collections) + + + integer + + + + + $_isSystem + \ArangoDBClient\Collection::_isSystem + + + The collection isSystem value (might be NULL for new collections) + + + boolean + + + + + $_isVolatile + \ArangoDBClient\Collection::_isVolatile + + + The collection isVolatile value (might be NULL for new collections) + + + boolean + + + + + $_distributeShardsLike + \ArangoDBClient\Collection::_distributeShardsLike + + + The distributeShardsLike value (might be NULL for new collections) + + + mixed + + + + + $_numberOfShards + \ArangoDBClient\Collection::_numberOfShards + + + The collection numberOfShards value (might be NULL for new collections) + + + mixed + + + + + $_replicationFactor + \ArangoDBClient\Collection::_replicationFactor + + + The replicationFactor value (might be NULL for new collections) + + + mixed + + + + + $_minReplicationFactor + \ArangoDBClient\Collection::_minReplicationFactor + + + The minimum replicationFactor value for writes to be successful + + + mixed + + + + + $_shardingStrategy + \ArangoDBClient\Collection::_shardingStrategy + + + The shardingStrategy value (might be NULL for new collections) + + + mixed + + + + + $_shardKeys + \ArangoDBClient\Collection::_shardKeys + + + The collection shardKeys value (might be NULL for new collections) + + + array + + + + + $_smartJoinAttribute + \ArangoDBClient\Collection::_smartJoinAttribute + + + The smartJoinAttribute value (might be NULL for new collections) + + + mixed + + + + + $_status + \ArangoDBClient\Collection::_status + + + The collection status value + + + integer + + + + + $_keyOptions + \ArangoDBClient\Collection::_keyOptions + + + The collection keyOptions value + + + array + + + + + __construct + \ArangoDBClient\StreamingTransactionCollection::__construct() + + Constructs a streaming transaction collection object + + + \ArangoDBClient\StreamingTransaction + + + string + + + string + + + + + $trx + + \ArangoDBClient\StreamingTransaction + + + $name + + string + + + $mode + + string + + + + __toString + \ArangoDBClient\StreamingTransactionCollection::__toString() + + Return the name of the collection + Returns the collection as JSON-encoded string + + + string + + + + + + getName + \ArangoDBClient\StreamingTransactionCollection::getName() + + Return the name of the collection + + + string + + + + + + getMode + \ArangoDBClient\StreamingTransactionCollection::getMode() + + Return the lock mode of the collection + + + string + + + + + getTrxId + \ArangoDBClient\StreamingTransactionCollection::getTrxId() + + Return the transaction's id + + + string + + + + + __construct + \ArangoDBClient\Collection::__construct() + + Constructs an empty collection + + + string + + + \ArangoDBClient\ClientException + + + + $name + null + string + + \ArangoDBClient\Collection + + + createFromArray + \ArangoDBClient\Collection::createFromArray() + + Factory method to construct a new collection + + + \ArangoDBClient\ClientException + + + array + + + \ArangoDBClient\Collection + + + + $values + + array + + \ArangoDBClient\Collection + + + getDefaultType + \ArangoDBClient\Collection::getDefaultType() + + Get the default collection type + + + string + + + \ArangoDBClient\Collection + + + __clone + \ArangoDBClient\Collection::__clone() + + Clone a collection + Returns the clone + + + void + + + \ArangoDBClient\Collection + + + __toString + \ArangoDBClient\Collection::__toString() + + Get a string representation of the collection + Returns the collection as JSON-encoded string + + + string + + + \ArangoDBClient\Collection + + + toJson + \ArangoDBClient\Collection::toJson() + + Returns the collection as JSON-encoded string + + + string + + + \ArangoDBClient\Collection + + + toSerialized + \ArangoDBClient\Collection::toSerialized() + + Returns the collection as a serialized string + + + string + + + \ArangoDBClient\Collection + + + getAll + \ArangoDBClient\Collection::getAll() + + Get all collection attributes + + + array + + + \ArangoDBClient\Collection + + + set + \ArangoDBClient\Collection::set() + + Set a collection attribute + The key (attribute name) must be a string. + +This will validate the value of the attribute and might throw an +exception if the value is invalid. + + \ArangoDBClient\ClientException + + + string + + + mixed + + + void + + + + $key + + string + + + $value + + mixed + + \ArangoDBClient\Collection + + + setId + \ArangoDBClient\Collection::setId() + + Set the collection id + This will throw if the id of an existing collection gets updated to some other id + + \ArangoDBClient\ClientException + + + mixed + + + boolean + + + + $id + + mixed + + \ArangoDBClient\Collection + + + getId + \ArangoDBClient\Collection::getId() + + Get the collection id (if already known) + Collection ids are generated on the server only. + +Collection ids are numeric but might be bigger than PHP_INT_MAX. +To reliably store a collection id elsewhere, a PHP string should be used + + mixed + + + \ArangoDBClient\Collection + + + setName + \ArangoDBClient\Collection::setName() + + Set the collection name + + + \ArangoDBClient\ClientException + + + string + + + void + + + + $name + + string + + \ArangoDBClient\Collection + + + getName + \ArangoDBClient\Collection::getName() + + Get the collection name (if already known) + + + string + + + \ArangoDBClient\Collection + + + setType + \ArangoDBClient\Collection::setType() + + Set the collection type. + This is useful before a collection is create() 'ed in order to set a different type than the normal one. +For example this must be set to 3 in order to create an edge-collection. + + \ArangoDBClient\ClientException + + + integer + + + void + + + + $type + + integer + + \ArangoDBClient\Collection + + + getType + \ArangoDBClient\Collection::getType() + + Get the collection type (if already known) + + + string + + + \ArangoDBClient\Collection + + + setStatus + \ArangoDBClient\Collection::setStatus() + + Set the collection status. + This is useful before a collection is create()'ed in order to set a status. + + \ArangoDBClient\ClientException + + + integer + + + void + + + + $status + + integer + + \ArangoDBClient\Collection + + + getStatus + \ArangoDBClient\Collection::getStatus() + + Get the collection status (if already known) + + + integer + + + \ArangoDBClient\Collection + + + setKeyOptions + \ArangoDBClient\Collection::setKeyOptions() + + Set the collection key options. + + + \ArangoDBClient\ClientException + + + array + + + void + + + + $keyOptions + + array + + \ArangoDBClient\Collection + + + getKeyOptions + \ArangoDBClient\Collection::getKeyOptions() + + Get the collection key options (if already known) + + + array + + + \ArangoDBClient\Collection + + + setWaitForSync + \ArangoDBClient\Collection::setWaitForSync() + + Set the waitForSync value + + + boolean + + + void + + + + $value + + boolean + + \ArangoDBClient\Collection + + + getWaitForSync + \ArangoDBClient\Collection::getWaitForSync() + + Get the waitForSync value (if already known) + + + boolean + + + \ArangoDBClient\Collection + + + setJournalSize + \ArangoDBClient\Collection::setJournalSize() + + Set the journalSize value + + + integer + + + void + + + + $value + + integer + + \ArangoDBClient\Collection + + + getJournalSize + \ArangoDBClient\Collection::getJournalSize() + + Get the journalSize value (if already known) + + + integer + + + \ArangoDBClient\Collection + + + setIsSystem + \ArangoDBClient\Collection::setIsSystem() + + Set the isSystem value + + + boolean + + + void + + + + $value + + boolean + + \ArangoDBClient\Collection + + + getIsSystem + \ArangoDBClient\Collection::getIsSystem() + + Get the isSystem value (if already known) + + + boolean + + + \ArangoDBClient\Collection + + + setIsVolatile + \ArangoDBClient\Collection::setIsVolatile() + + Set the isVolatile value + + + boolean + + + void + + + + $value + + boolean + + \ArangoDBClient\Collection + + + getIsVolatile + \ArangoDBClient\Collection::getIsVolatile() + + Get the isVolatile value (if already known) + + + boolean + + + \ArangoDBClient\Collection + + + setDistributeShardsLike + \ArangoDBClient\Collection::setDistributeShardsLike() + + Set the distribute shards like value + + + string + + + void + + + + $value + + string + + \ArangoDBClient\Collection + + + getDistributeShardsLike + \ArangoDBClient\Collection::getDistributeShardsLike() + + Get the distributeShardsLike (if already known) + + + mixed + + + \ArangoDBClient\Collection + + + setNumberOfShards + \ArangoDBClient\Collection::setNumberOfShards() + + Set the numberOfShards value + + + integer + + + void + + + + $value + + integer + + \ArangoDBClient\Collection + + + getNumberOfShards + \ArangoDBClient\Collection::getNumberOfShards() + + Get the numberOfShards value (if already known) + + + mixed + + + \ArangoDBClient\Collection + + + setReplicationFactor + \ArangoDBClient\Collection::setReplicationFactor() + + Set the replicationFactor value + + + mixed + + + void + + + + $value + + mixed + + \ArangoDBClient\Collection + + + getReplicationFactor + \ArangoDBClient\Collection::getReplicationFactor() + + Get the replicationFactor value (if already known) + + + mixed + + + \ArangoDBClient\Collection + + + setMinReplicationFactor + \ArangoDBClient\Collection::setMinReplicationFactor() + + Set the minReplicationFactor value + + + integer + + + void + + + + $value + + integer + + \ArangoDBClient\Collection + + + getMinReplicationFactor + \ArangoDBClient\Collection::getMinReplicationFactor() + + Get the minReplicationFactor value (if already known) + + + mixed + + + \ArangoDBClient\Collection + + + setShardingStrategy + \ArangoDBClient\Collection::setShardingStrategy() + + Set the shardingStrategy value + + + string + + + void + + + + $value + + string + + \ArangoDBClient\Collection + + + getShardingStrategy + \ArangoDBClient\Collection::getShardingStrategy() + + Get the sharding strategy value (if already known) + + + mixed + + + \ArangoDBClient\Collection + + + setShardKeys + \ArangoDBClient\Collection::setShardKeys() + + Set the shardKeys value + + + array + + + void + + + + $value + + array + + \ArangoDBClient\Collection + + + getShardKeys + \ArangoDBClient\Collection::getShardKeys() + + Get the shardKeys value (if already known) + + + array + + + \ArangoDBClient\Collection + + + setSmartJoinAttribute + \ArangoDBClient\Collection::setSmartJoinAttribute() + + Set the smart join attribute value + + + string + + + void + + + + $value + + string + + \ArangoDBClient\Collection + + + getSmartJoinAttribute + \ArangoDBClient\Collection::getSmartJoinAttribute() + + Get the smart join attribute value (if already known) + + + mixed + + + \ArangoDBClient\Collection + + + eJytVU2P2jAQvedXzGGlsChAP9RD2bLdlkq7rdpqVTgiIZOY4G5iR7ZDWVX97x072eCYr65KDmBlZp7fezOO370vVkUQDLrdALrwQRKeik8f4f7uHuKMUa6HoLSkJGc8BY1hRWLNBIdYZBm1Syw0tTcFiR9ISgEamLFFsEFS6pWQGIMvhMNEU5oTzm0oFsWjZOlKw7hZvXrx8m20pXObL+4iDGci5TSCWyqx+hGrB0HASU4V7k29ba8aVZMTAkAsfuLK17FHhWI8NgJf99/YzeOMKLXFn27hx1t0utGUJwqcV8HvwFhh+ZmnC9MVbbHrASIzVJuA5cqxC2Vtt614KrxZE7mXAUI4gHX6wP4Xkq2JpnAx13KDPnlcHKLG3GdywaCxuucabGAOMDChXQpfRfwAuUgoLHFq9IopBy4C1qd9CFFzEkYQ/pJM0xAwMaSbOCsVW9PwKLXsCf4AKRNCUrvG1NIVkJPHopmqNo+CSJLvb9gFdgNM29qz4JXWIi5sa9rPIc/9UmusX9p4st/eaI+5tW3lImMxLEtebTyfNyPSOagzqgREFZlLC1QdCgQk0nx4hi6Qzb6sBwUQAkeidz23jlXPyOJeeQmOS6NqSz/DMWNUsaky/thffwR+UF1KbltkocXSrt2vYbvfOUlZ7L+UFcq/HZUde7WY2MJO2zaAGtbVflYt/0M7pfo75pyRczOwzyd+tllHVd8Q5pQqd6qOKHIOfaiAJadkuB+eJvsg0ancfE58ph5RPEG9a8w1iTVhCJCzvejmJGNEdZyjPBzaAPo1Q054aXI1q6/Nxez4tRgi/l+n73yn + + + + ArangoDB PHP client: admin document handler + + + + + + + + \ArangoDBClient\Handler - GraphHandler - \ArangoDBClient\GraphHandler - - A handler that manages graphs. - - - + AdminHandler + \ArangoDBClient\AdminHandler + + Provides access to ArangoDB's administration interface + The admin handler utilizes ArangoDB's Admin API. + + - - ENTRY_GRAPH - \ArangoDBClient\GraphHandler::ENTRY_GRAPH - 'graph' - + + OPTION_DETAILS + \ArangoDBClient\AdminHandler::OPTION_DETAILS + 'details' + + details for server version + + + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object + + + \ArangoDBClient\Connection + + + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + + + string + + + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + + string + + + + + getEngine + \ArangoDBClient\AdminHandler::getEngine() + + Get the server's storage engine + This will throw if the engine data cannot be retrieved + + \ArangoDBClient\Exception + + + mixed + + + + + + getServerVersion + \ArangoDBClient\AdminHandler::getServerVersion() + + Get the server version + This will throw if the version cannot be retrieved + + boolean + + + \ArangoDBClient\Exception + + + string + + + + + $details + false + boolean + + + + getServerRole + \ArangoDBClient\AdminHandler::getServerRole() + + Get the server role + This will throw if the role cannot be retrieved + + \ArangoDBClient\Exception + + + string + + + + + + getServerTime + \ArangoDBClient\AdminHandler::getServerTime() + + Get the server time + This will throw if the time cannot be retrieved + + \ArangoDBClient\Exception + + + double + + + + + + getServerLog + \ArangoDBClient\AdminHandler::getServerLog() + + Get the server log + This will throw if the log cannot be retrieved + + \ArangoDBClient\Exception + + + array + + + array + + + + + $options + array() + array + + + + reloadServerRouting + \ArangoDBClient\AdminHandler::reloadServerRouting() + + Reload the server's routing information +The call triggers a reload of the routing information from the _routing collection + This will throw if the routing cannot be reloaded + + \ArangoDBClient\Exception + + + boolean + + + + + + getServerStatistics + \ArangoDBClient\AdminHandler::getServerStatistics() + + Get the server statistics +Returns the statistics information. The returned objects contains the statistics figures, grouped together +according to the description returned by _admin/statistics-description. + For instance, to access a figure userTime from the group system, you first select the sub-object +describing the group stored in system and in that sub-object the value for userTime is stored in the +attribute of the same name.In case of a distribution, the returned object contains the total count in count +and the distribution list in counts. +For more information on the statistics returned, please lookup the statistics interface description at + + + \ArangoDBClient\Exception + + + array + + + + + + + getServerStatisticsDescription + \ArangoDBClient\AdminHandler::getServerStatisticsDescription() + + Returns a description of the statistics returned by getServerStatistics(). + The returned objects contains a list of statistics groups in the attribute groups +and a list of statistics figures in the attribute figures. +For more information on the statistics returned, please lookup the statistics interface description at + + + \ArangoDBClient\Exception + + + array + + + array + + + + + + $options + array() + array + + + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler + + + \ArangoDBClient\Connection + + + + $connection + + \ArangoDBClient\Connection + + \ArangoDBClient\Handler + + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object + + + \ArangoDBClient\Connection + + + \ArangoDBClient\Handler + + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() + + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection + + + + mixed + + + \ArangoDBClient\ClientException + + + + $optionName + + + + \ArangoDBClient\Handler + + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + + array + + + string + + + \ArangoDBClient\ClientException + + + + $body + + array + + \ArangoDBClient\Handler + + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + + Helper function that runs through the options given and includes them into the parameters array given. + Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . + + array + + + array + + + array + + + array + + + + $options + + array + + + $body + + array + + + $includeArray + array() + array + + \ArangoDBClient\Handler + + + makeCollection + \ArangoDBClient\Handler::makeCollection() + + Turn a value into a collection name + + + \ArangoDBClient\ClientException + + + mixed + + + string + + + + $value + + mixed + + \ArangoDBClient\Handler + + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + + array + + + mixed + + + + $headers + + array + + + $collection + + mixed + + \ArangoDBClient\Handler + + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use + + + string + + + \ArangoDBClient\DocumentClassable + + + + $class + + string + + \ArangoDBClient\DocumentClassable + + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use + + + string + + + \ArangoDBClient\DocumentClassable + + + + $class + + string + + \ArangoDBClient\DocumentClassable + + + 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 + + + + ArangoDB PHP client: document handler + + + + + + + + \ArangoDBClient\DocumentHandler + EdgeHandler + \ArangoDBClient\EdgeHandler + + A handler that manages edges + An edge-document handler that fetches edges from the server and +persists them on the server. It does so by issuing the +appropriate HTTP requests to the server. + + + + + + ENTRY_DOCUMENTS + \ArangoDBClient\EdgeHandler::ENTRY_DOCUMENTS + 'edge' + documents array index + - - OPTION_REVISION - \ArangoDBClient\GraphHandler::OPTION_REVISION - 'revision' - - conditional update of edges or vertices + + ENTRY_EDGES + \ArangoDBClient\EdgeHandler::ENTRY_EDGES + 'edges' + + edges array index - - OPTION_VERTICES - \ArangoDBClient\GraphHandler::OPTION_VERTICES - 'vertices' - + + OPTION_COLLECTION + \ArangoDBClient\EdgeHandler::OPTION_COLLECTION + 'collection' + + collection parameter + + + + + + OPTION_EXAMPLE + \ArangoDBClient\EdgeHandler::OPTION_EXAMPLE + 'example' + + example parameter + + + + + + OPTION_FROM + \ArangoDBClient\EdgeHandler::OPTION_FROM + 'from' + + example parameter + + + + + OPTION_TO + \ArangoDBClient\EdgeHandler::OPTION_TO + 'to' + + example parameter + + + + + OPTION_VERTEX + \ArangoDBClient\EdgeHandler::OPTION_VERTEX + 'vertex' + vertex parameter - - OPTION_EDGES - \ArangoDBClient\GraphHandler::OPTION_EDGES - 'edges' - + + OPTION_DIRECTION + \ArangoDBClient\EdgeHandler::OPTION_DIRECTION + 'direction' + direction parameter - - OPTION_KEY - \ArangoDBClient\GraphHandler::OPTION_KEY - '_key' - - direction parameter + + ENTRY_DOCUMENTS + \ArangoDBClient\DocumentHandler::ENTRY_DOCUMENTS + 'documents' + + documents array index - + OPTION_COLLECTION - \ArangoDBClient\GraphHandler::OPTION_COLLECTION + \ArangoDBClient\DocumentHandler::OPTION_COLLECTION 'collection' - + collection parameter - - OPTION_COLLECTIONS - \ArangoDBClient\GraphHandler::OPTION_COLLECTIONS - 'collections' - - collections parameter + + OPTION_EXAMPLE + \ArangoDBClient\DocumentHandler::OPTION_EXAMPLE + 'example' + + example parameter + + + + + OPTION_OVERWRITE + \ArangoDBClient\DocumentHandler::OPTION_OVERWRITE + 'overwrite' + + overwrite option + + + + + OPTION_RETURN_OLD + \ArangoDBClient\DocumentHandler::OPTION_RETURN_OLD + 'returnOld' + + option for returning the old document + + + + + OPTION_RETURN_NEW + \ArangoDBClient\DocumentHandler::OPTION_RETURN_NEW + 'returnNew' + + option for returning the new document + + + + + $_connection + \ArangoDBClient\Handler::_connection + + + Connection object + + + \ArangoDBClient\Connection + + + + + $_documentClass + \ArangoDBClient\DocumentClassable::_documentClass + '\ArangoDBClient\Document' + + + + + string + + + + + $_edgeClass + \ArangoDBClient\DocumentClassable::_edgeClass + '\ArangoDBClient\Edge' + + + + + string + + + + + __construct + \ArangoDBClient\EdgeHandler::__construct() + + Construct a new handler + + + \ArangoDBClient\Connection + + + + $connection + + \ArangoDBClient\Connection + + + + createFromArrayWithContext + \ArangoDBClient\EdgeHandler::createFromArrayWithContext() + + Intermediate function to call the createFromArray function from the right context + + + + \ArangoDBClient\Edge + + + \ArangoDBClient\ClientException + + + + + $data + + + + + $options + + + + + + saveEdge + \ArangoDBClient\EdgeHandler::saveEdge() + + save an edge to an edge-collection + This will save the edge to the collection and return the edges-document's id + +This will throw if the document cannot be saved + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + mixed + + + mixed + + + array + + + mixed + + - - - KEY_FROM - \ArangoDBClient\GraphHandler::KEY_FROM - '_from' - - example parameter + + $collection + + mixed + + + $from + + mixed + + + $to + + mixed + + + $document + + mixed + + + $options + array() + array + + + + edges + \ArangoDBClient\EdgeHandler::edges() + + Get connected edges for a given vertex + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + string + + + array + + + array + + - - - KEY_TO - \ArangoDBClient\GraphHandler::KEY_TO - '_to' - - example parameter + + $collection + + mixed + + + $vertexHandle + + mixed + + + $direction + 'any' + string + + + $options + array() + array + + + + inEdges + \ArangoDBClient\EdgeHandler::inEdges() + + Get connected inbound edges for a given vertex + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + array + - - - OPTION_NAME - \ArangoDBClient\GraphHandler::OPTION_NAME - 'name' - - name parameter + + $collection + + mixed + + + $vertexHandle + + mixed + + + + outEdges + \ArangoDBClient\EdgeHandler::outEdges() + + Get connected outbound edges for a given vertex + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + array + - - - OPTION_EDGE_DEFINITION - \ArangoDBClient\GraphHandler::OPTION_EDGE_DEFINITION - 'edgeDefinition' - - edge definition parameter + + $collection + + mixed + + + $vertexHandle + + mixed + + + + lazyCreateCollection + \ArangoDBClient\EdgeHandler::lazyCreateCollection() + + + + + array + + - - - OPTION_EDGE_DEFINITIONS - \ArangoDBClient\GraphHandler::OPTION_EDGE_DEFINITIONS - 'edgeDefinitions' - - edge definitions parameter - + + $collection + + mixed + + + $options + + array + + + + get + \ArangoDBClient\DocumentHandler::get() + + Get a single document from a collection + Alias method for getById() + + \ArangoDBClient\Exception + + + string + + + mixed + + + array + + + \ArangoDBClient\Document + - - - OPTION_ORPHAN_COLLECTIONS - \ArangoDBClient\GraphHandler::OPTION_ORPHAN_COLLECTIONS - 'orphanCollections' - - orphan collection parameter - + + $collection + + string + + + $documentId + + mixed + + + $options + array() + array + + \ArangoDBClient\DocumentHandler + + + has + \ArangoDBClient\DocumentHandler::has() + + Check if a document exists + This will call self::get() internally and checks if there +was an exception thrown which represents an 404 request. + + \ArangoDBClient\Exception + + + string + + + mixed + + + boolean + - - - OPTION_DROP_COLLECTION - \ArangoDBClient\GraphHandler::OPTION_DROP_COLLECTION - 'dropCollection' + + $collection + + string + + + $documentId + + mixed + + \ArangoDBClient\DocumentHandler + + + getById + \ArangoDBClient\DocumentHandler::getById() - drop collection - + Get a single document from a collection + This will throw if the document cannot be fetched from the server. + + \ArangoDBClient\Exception + + + string + + + mixed + + + array + + + \ArangoDBClient\Document + - - - $cache - \ArangoDBClient\GraphHandler::cache - - - GraphHandler cache store - + + $collection + + string + + + $documentId + + mixed + + + $options + array() + array + + \ArangoDBClient\DocumentHandler + + + getHead + \ArangoDBClient\DocumentHandler::getHead() + + Gets information about a single documents from a collection + This will throw if the document cannot be fetched from the server + + \ArangoDBClient\Exception + + + string + + + mixed + + + boolean + + + string + + + array + - - - $cacheEnabled - \ArangoDBClient\GraphHandler::cacheEnabled - false - - + + $collection + + string + + + $documentId + + mixed + + + $revision + null + string + + + $ifMatch + null + boolean + + \ArangoDBClient\DocumentHandler + + + createFromArrayWithContext + \ArangoDBClient\DocumentHandler::createFromArrayWithContext() + + Intermediate function to call the createFromArray function from the right context - + + + + \ArangoDBClient\Document + + + \ArangoDBClient\ClientException + - - - $batchsize - \ArangoDBClient\GraphHandler::batchsize - - - batchsize - + + $data + + + + + $options + + + + \ArangoDBClient\DocumentHandler + + + store + \ArangoDBClient\DocumentHandler::store() + + Store a document to a collection + This is an alias/shortcut to save() and replace(). Instead of having to determine which of the 3 functions to use, +simply pass the document to store() and it will figure out which one to call. + +This will throw if the document cannot be saved or replaced. + + \ArangoDBClient\Exception + + + \ArangoDBClient\Document + + + mixed + + + array + + + mixed + + - - - $count - \ArangoDBClient\GraphHandler::count - - - count - + + $document + + \ArangoDBClient\Document + + + $collection + null + mixed + + + $options + array() + array + + \ArangoDBClient\DocumentHandler + + + insert + \ArangoDBClient\DocumentHandler::insert() + + insert a document into a collection + This will add the document to the collection and return the document's id + +This will throw if the document cannot be saved + + \ArangoDBClient\Exception + + + mixed + + + \ArangoDBClient\Document + array + + + array + + + mixed + + - - - $limit - \ArangoDBClient\GraphHandler::limit - - - limit - + + $collection + + mixed + + + $document + + \ArangoDBClient\Document|array + + + $options + array() + array + + \ArangoDBClient\DocumentHandler + + + save + \ArangoDBClient\DocumentHandler::save() + + Insert a document into a collection + This is an alias for insert(). - - - $_connection - \ArangoDBClient\Handler::_connection - - - Connection object - - - \ArangoDBClient\Connection + + $collection + + + + + $document + + + + + $options + array() + array + + \ArangoDBClient\DocumentHandler + + + update + \ArangoDBClient\DocumentHandler::update() + + Update an existing document in a collection, identified by the including _id and optionally _rev in the patch document. + Attention - The behavior of this method has changed since version 1.1 + +This will update the document on the server + +This will throw if the document cannot be updated + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the document to-be-replaced is the same as the one given. + + \ArangoDBClient\Exception - - - - $_documentClass - \ArangoDBClient\DocumentClassable::_documentClass - '\ArangoDBClient\Document' - - - - - string + + \ArangoDBClient\Document + + + array + + + boolean - - - $_edgeClass - \ArangoDBClient\DocumentClassable::_edgeClass - '\ArangoDBClient\Edge' - - - - + + $document + + \ArangoDBClient\Document + + + $options + array() + array + + \ArangoDBClient\DocumentHandler + + + updateById + \ArangoDBClient\DocumentHandler::updateById() + + Update an existing document in a collection, identified by collection id and document id +Attention - The behavior of this method has changed since version 1.1 + This will update the document on the server + +This will throw if the document cannot be updated + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the document to-be-updated is the same as the one given. + + \ArangoDBClient\Exception + + string + + mixed + + + \ArangoDBClient\Document + + + array + + + boolean + - - - createGraph - \ArangoDBClient\GraphHandler::createGraph() - - Create a graph - This will create a graph using the given graph object and return an array of the created graph object's attributes.<br><br> - + + $collection + + string + + + $documentId + + mixed + + + $document + + \ArangoDBClient\Document + + + $options + array() + array + + \ArangoDBClient\DocumentHandler + + + replace + \ArangoDBClient\DocumentHandler::replace() + + Replace an existing document in a collection, identified by the document itself + This will replace the document on the server + +This will throw if the document cannot be replaced + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the to-be-replaced document is the same as the one given. + \ArangoDBClient\Exception - - \ArangoDBClient\Graph + + \ArangoDBClient\Document - + array - + + boolean + - $graph + $document - \ArangoDBClient\Graph + \ArangoDBClient\Document + + $options + array() + array + + \ArangoDBClient\DocumentHandler - - getGraph - \ArangoDBClient\GraphHandler::getGraph() - - Get a graph - This will get a graph.<br><br> - - String + + replaceById + \ArangoDBClient\DocumentHandler::replaceById() + + Replace an existing document in a collection, identified by collection id and document id + This will update the document on the server + +This will throw if the document cannot be Replaced + +If policy is set to error (locally or globally through the ConnectionOptions) +and the passed document has a _rev value set, the database will check +that the revision of the to-be-replaced document is the same as the one given. + + \ArangoDBClient\Exception - - array + + mixed - - \ArangoDBClient\Graph - false + + mixed - - \ArangoDBClient\ClientException + + \ArangoDBClient\Document + + + array + + + boolean - - $graph + $collection - String + mixed + + + $documentId + + mixed + + + $document + + \ArangoDBClient\Document $options array() array + \ArangoDBClient\DocumentHandler - - setBatchsize - \ArangoDBClient\GraphHandler::setBatchsize() - - Sets the batchsize for any method creating a cursor. - Will be reset after the cursor has been created. - - integer + + remove + \ArangoDBClient\DocumentHandler::remove() + + Remove a document from a collection, identified by the document itself + + + \ArangoDBClient\Exception + + + \ArangoDBClient\Document + + + array + + + boolean - $batchsize + $document - integer + \ArangoDBClient\Document + + + $options + array() + array + \ArangoDBClient\DocumentHandler - - setCount - \ArangoDBClient\GraphHandler::setCount() - - Sets the count for any method creating a cursor. - Will be reset after the cursor has been created. - - integer + + removeById + \ArangoDBClient\DocumentHandler::removeById() + + Remove a document from a collection, identified by the collection id and document id + + + \ArangoDBClient\Exception + + + mixed + + + mixed + + + mixed + + + array + + + boolean - $count + $collection - integer + mixed + + + $documentId + + mixed + + + $revision + null + mixed + + + $options + array() + array + \ArangoDBClient\DocumentHandler - - setLimit - \ArangoDBClient\GraphHandler::setLimit() - - Sets the limit for any method creating a cursor. - Will be reset after the cursor has been created. - - integer + + getDocumentId + \ArangoDBClient\DocumentHandler::getDocumentId() + + Helper function to get a document id from a document or a document id value + + + \ArangoDBClient\ClientException + + + mixed + + + mixed - $limit + $document - integer + mixed + \ArangoDBClient\DocumentHandler - - properties - \ArangoDBClient\GraphHandler::properties() - - Get a graph's properties<br><br> + + getRevision + \ArangoDBClient\DocumentHandler::getRevision() + + Helper function to get a document id from a document or a document id value - - \ArangoDBClient\Exception + + \ArangoDBClient\ClientException - + mixed - - boolean + + mixed - - $graph + $document mixed + \ArangoDBClient\DocumentHandler - - dropGraph - \ArangoDBClient\GraphHandler::dropGraph() - - Drop a graph and remove all its vertices and edges, also drops vertex and edge collections<br><br> + + lazyCreateCollection + \ArangoDBClient\DocumentHandler::lazyCreateCollection() + + - - \ArangoDBClient\Exception - - + mixed - - boolean - - - boolean + + array - - $graph + $collection mixed - $dropCollections - true - boolean + $options + + array + \ArangoDBClient\DocumentHandler - - addOrphanCollection - \ArangoDBClient\GraphHandler::addOrphanCollection() - - add an orphan collection to the graph. - This will add a further orphan collection to the graph.<br><br> - - \ArangoDBClient\Exception - - - mixed - - - string - - - \ArangoDBClient\Graph + + __construct + \ArangoDBClient\Handler::__construct() + + Construct a new handler + + + \ArangoDBClient\Connection - - $graph - - mixed - - - $orphanCollection + $connection - string + \ArangoDBClient\Connection + \ArangoDBClient\Handler - - deleteOrphanCollection - \ArangoDBClient\GraphHandler::deleteOrphanCollection() - - deletes an orphan collection from the graph. - This will delete an orphan collection from the graph.<br><br> - - \ArangoDBClient\Exception + + getConnection + \ArangoDBClient\Handler::getConnection() + + Return the connection object + + + \ArangoDBClient\Connection - + + \ArangoDBClient\Handler + + + getConnectionOption + \ArangoDBClient\Handler::getConnectionOption() + + Return a connection option +This is a convenience function that calls json_encode_wrapper on the connection + + + mixed - - string - - - boolean - - - \ArangoDBClient\Graph + + \ArangoDBClient\ClientException - - $graph + $optionName - mixed + + \ArangoDBClient\Handler + + + json_encode_wrapper + \ArangoDBClient\Handler::json_encode_wrapper() + + Return a json encoded string for the array passed. + This is a convenience function that calls json_encode_wrapper on the connection + + array + + + string + + + \ArangoDBClient\ClientException + + - $orphanCollection + $body - string - - - $dropCollection - false - boolean + array + \ArangoDBClient\Handler - - getVertexCollections - \ArangoDBClient\GraphHandler::getVertexCollections() - - gets all vertex collection from the graph. - This will get all vertex collection (orphans and used in edge definitions) from the graph.<br><br> - -If this method or any method that calls this method is used in batch mode and caching is off,<br> -then for each call, this method will make an out of batch API call to the db in order to get the appropriate collections.<br><br> - -If caching is on, then the GraphHandler will only call the DB API once for the chosen graph, and return data from cache for the following calls.<br> - - mixed + + includeOptionsInBody + \ArangoDBClient\Handler::includeOptionsInBody() + + Helper function that runs through the options given and includes them into the parameters array given. + Only options that are set in $includeArray will be included. +This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . + + array - + array - + array - - \ArangoDBClient\ClientException@since + + array - $graph + $options - mixed + array - $options + $body + + array + + + $includeArray array() array + \ArangoDBClient\Handler - - addEdgeDefinition - \ArangoDBClient\GraphHandler::addEdgeDefinition() - - adds an edge definition to the graph. - This will add a further edge definition to the graph.<br><br> - - \ArangoDBClient\Exception + + makeCollection + \ArangoDBClient\Handler::makeCollection() + + Turn a value into a collection name + + + \ArangoDBClient\ClientException - + mixed - - \ArangoDBClient\EdgeDefinition - - - \ArangoDBClient\Graph + + string - - $graph + $value mixed + \ArangoDBClient\Handler + + + addTransactionHeader + \ArangoDBClient\Handler::addTransactionHeader() + + Add a transaction header to the array of headers in case this is a transactional operation + + + array + + + mixed + + + + $headers + + array + - $edgeDefinition + $collection - \ArangoDBClient\EdgeDefinition + mixed + \ArangoDBClient\Handler - - deleteEdgeDefinition - \ArangoDBClient\GraphHandler::deleteEdgeDefinition() - - deletes an edge definition from the graph. - This will delete an edge definition from the graph.<br><br> - - \ArangoDBClient\Exception + + setDocumentClass + \ArangoDBClient\DocumentClassable::setDocumentClass() + + Sets the document class to use + + + string - - mixed + + \ArangoDBClient\DocumentClassable - + + + $class + + string + + \ArangoDBClient\DocumentClassable + + + setEdgeClass + \ArangoDBClient\DocumentClassable::setEdgeClass() + + Sets the edge class to use + + string - - boolean - - - \ArangoDBClient\Graph + + \ArangoDBClient\DocumentClassable - - $graph - - mixed - - - $edgeDefinition + $class string - - $dropCollection - false - boolean - + \ArangoDBClient\DocumentClassable - - getEdgeCollections - \ArangoDBClient\GraphHandler::getEdgeCollections() - - gets all edge collections from the graph. - This will get all edge collections from the graph.<br><br> - -If this method or any method that calls this method is used in batch mode and caching is off,<br> -then for each call, this method will make an out of batch API call to the db in order to get the appropriate collections.<br><br> - -If caching is on, then the GraphHandler will only call the DB API once for the chosen graph, and return data from cache for the following calls.<br> - - \ArangoDBClient\Exception - - - mixed - - - array - - + + + No summary for method lazyCreateCollection() + + eJztWm1zGrcW/u5foXo8ATLYbtNv3Ng3LiY2GSf22CRtx2EYsStAzaLdroRtetP/fs/Ry65WLDY4zbfuTBLQ6rw951Uir/+bzbKdncOXL3fIS3KSUzFNT38hV+dXJEo4E6pD4jRazOETmVERJyyHjbj3TUajL3TKCCnIuppCv6QLNUtzeEfeUUFuFGNzKkTw6i3QfSHv6VIzJW+iNFvmfDpTpFt8evXjT6/aROUcRAlJzubj8za8TtKpYG1yxnLguwTqw50dQedMglYsUOg/pX3OBqJmVBEgBa6SsBj+tmadCP11P7TaUEyYimaOgkzydA7rjEiW38EW2IksMpZLLpXEV3OSCm/LAekrABRoZUrGS8KlXHAxxR1ISbMsTzOwVTFyPhhckZz9uWCaVepz2cgFkosIXxHy08GPGqEooVKSHuh+bo1iD4qJWJJTa61d3/nfDtJp1PB5WQSBJDTPKSguYvZgXx7qf6NUSEV6HwbXv49OL7sf38PHG3JEGohVA3wQcDQQbsKtd3rWKzjJGlZRmiQsUhygzmgOUaAwoFa4XV4N+pcfRt3Li4teFz8iz5K2TscHOs8StgnX3m8n768uelpNQ/Vt/N5eX75HZhhj38ZpcIl8VFrDBWJJsYdNmHzqXQ96vyEjQ1PDLOb55k447V+XPigoa7h2kSpfRIpQIth9WYT0a7frjRaJm4XVYS8qP+8T7wtk0piRhWRxlYdRMluMEx6RyUKY3aNR5BRo1nNvaTqTMJoDzbFsdnxKf7s1EZ89NeNy/1gy5fKvixnabHyupvNnTNkGUCLR3ysQ9QVAPWexLhuF5mBnRJNEl40oZ/DuLYTSic63YlNRwUyxBTXBt6oe3L2YKhqupRnykSFFztQiF7rUFGtqlqf3koS2mX96DxHTrB71RmDHr1zNukblptauXSgUemVvhMVDwwsRZ4Ev1zynWNU9gk4nkLsirPBM6Jp3Cwh5bTg0B0haayThEyLpHWu2oANoN7EYG4UucAchmBz9K2hS75Y5fwBiNNErg/t+TeQxodBwoIdCp4HOKxbzcZFBjo2LQHCz+0SADcZGsWBSh8ZxkTuO2pRxVOLxgNDKfr1LeRyGRX0YFLskM63M716dDmKIC83WJrmsEfdQape2tq0FTn2IkdthGEPGj1iEAmWbuz3dzGKoYDgw3AFIzr9QB2dpfECuEkalrjuk1Hp3feRIzcWEBAJvP+6X6gcQDSCkyT2HjNek6DhHq0tAGQ+Anotyt0sW805DEh6vZW0ggOitxEUEo12qMDZQdEjtPLzWt34c+0Fsn+1j2bLSxa3y7JuCZ1pYPRHARUIiWHuMxEuYksQCu1+XPG1EDL9lUF2Ytgi+p+M/wEg0Cr7ocKxNsiJEfXFmjSYujtOJXSqqSWjVyvM6O760nKGDkc7rcX68MW3CjxumSHbLeQo9p9fCAIT44XYMxrhZMgWlESbmg9eHwGgrofeUq7dpfrMUEcrThZVpsKHzwgEBJAOYELk5m6d3NAFYWE6NmTqiOfRoKlSy1OELbCBYBUevAI+Yyy8H2wDRx8yAZOHGMpmxiE84elwrUsUBUi1mE7pIlBYMCkDp4OB/rRgGS5ZBoYm3hOUwOw4zzK++gBIkEQRImb7aSWVFNgcHfWjQK+urqa5i1YqKCdbGNNq2uvqZX3ToOf3iRZQvyp+jwOlNLkfU9mYrtdXyuGsJT80Alc0FPEdPzQJOXsng750VNnrMQ6qmhsjbXN0ySJsAXmVK1NnvqQzuSRYxs9naF1f6fbOqvoW6TW4r6/hUk0Y/R8eO+ZSpcs41IprhAqBgx/hfT/qD0c3vH7qtdkXMsPgW+gkcBVY2nX63q2Vj2CIvXpDHN3z9WrW2RvdmSy88aUL3uncy6K0Gi2GZ0L+W3UCBIOKNeyre93wLgyJ6rvQx6HSSJAB/X8BpXn3MYAuMAr7DF3li3UI+5sk5SzIcdqAawFndOBuWm/AHrPh4faEPyOSANA4b8PcTyu3lTGZgPyvjaQW2LJXgIdCi7bb8IVMxYiJKYza6z1GT3AzBrYriSRpRl8BOjuZ/YV+cMxoDqacPxsQPBWHohfUjV+MUqhjW2AmHcaYQPNMCoKq7OxmnRmONg9CyFXXfSQTCA43HoTem5aGtH2NeOxObpTE+NJUk79uJvh83tQK3WEg7HXPd0T8drq0O1+yOSy1khey692kYJhvq/cNRGH4gdSXcHwH6DECGiYQLaJ88LgANb7/WAVw1XH5g980JTSRr1Zy5VtRcOx6fMeUO9dDS7HUcjk5kyu+g01bmtWdNoiuj6H44gG8zjJI9o5E5uhA3ItoLGMA2Te5WTlWW8155s2IVceOemx/0/WCDimXjgFwC35xACks+BkmfaLIAbBoc5rEXpJEuVKP+7BbOlY8NlZvNIuFEuSEVjnUj2+Ncokgc7nCiQ0PtOw2gOxsTqgCs8ULB+ZmceqjoWNtigLLipyLN2TmHaV2cFJx9JeQM8mWmN/xzstePbsYD+6UnguDfcnjTNEEf8wO07QfdkQmt7z3FuTkHC211aJEsmRT92t5EEjO0VJReT+RdNx57phUEQ6/gPqf73hTtF6hNn6yY+dxOPGWmEXtk1QI/piqagVZqpYf94t6sFntXbgvi+spdTGAjjmW7MQQZOqQ9G3T7rDxP9lJTrKskt54DoIwzGs2I7XHGj94vAUMsumb4CGc2zfp2WAK6xYVhLQYOKc14w2bExThdiO/TlKo96Zs6UrUhPdaOnlmL6isPF70nak9YUpwPjEefrlzY6tbelVddBd3wX1+t9xXA892dhQPJWm9ZEGx2V/A0wHhL+Osvwsjr76ar4803DjfPmGzWXpG5gWKjqzJ9TbbpRFErcrDMGIrddbP2LoL2Ssd+eSNUbN9G1tqXuxgHWs7PWo6+l36GjHI8svGap8rEchGyG5zX1/1CtPbCQUOGTeXnske4X/m2kOeCHMJc/xA/guMUlc3KDxr6BWTFZ/cfHtyvZePP3j5MmP8DIK/JBg== + + + + ArangoDB PHP client: connection options + + + + + + + + \ArrayAccess + ConnectionOptions + \ArangoDBClient\ConnectionOptions + + Simple container class for connection options. + This class also provides the default values for the connection +options and will perform a simple validation of them.<br> +It provides array access to its members.<br> +<br> + + + + + OPTION_ENDPOINT + \ArangoDBClient\ConnectionOptions::OPTION_ENDPOINT + 'endpoint' + + Endpoint string index constant + + + + + OPTION_HOST + \ArangoDBClient\ConnectionOptions::OPTION_HOST + 'host' + + Host name string index constant (deprecated, use endpoint instead) + + + + + OPTION_PORT + \ArangoDBClient\ConnectionOptions::OPTION_PORT + 'port' + + Port number index constant (deprecated, use endpoint instead) + + + + + OPTION_TIMEOUT + \ArangoDBClient\ConnectionOptions::OPTION_TIMEOUT + 'timeout' + + Timeout value index constant + + + + + OPTION_FAILOVER_TRIES + \ArangoDBClient\ConnectionOptions::OPTION_FAILOVER_TRIES + 'failoverTries' + + Number of servers tried in case of failover +if set to 0, then an unlimited amount of servers will be tried + + + + + OPTION_FAILOVER_TIMEOUT + \ArangoDBClient\ConnectionOptions::OPTION_FAILOVER_TIMEOUT + 'failoverTimeout' + + Max amount of time (in seconds) that is spent waiting on failover + + + + + OPTION_TRACE + \ArangoDBClient\ConnectionOptions::OPTION_TRACE + 'trace' + + Trace function index constant + + + + + OPTION_VERIFY_CERT + \ArangoDBClient\ConnectionOptions::OPTION_VERIFY_CERT + 'verifyCert' + + "verify certificates" index constant + + + + + OPTION_VERIFY_CERT_NAME + \ArangoDBClient\ConnectionOptions::OPTION_VERIFY_CERT_NAME + 'verifyCertName' + + "verify certificate host name" index constant + + + + + OPTION_ALLOW_SELF_SIGNED + \ArangoDBClient\ConnectionOptions::OPTION_ALLOW_SELF_SIGNED + 'allowSelfSigned' + + "allow self-signed" index constant + + + + + OPTION_CA_FILE + \ArangoDBClient\ConnectionOptions::OPTION_CA_FILE + 'caFile' + + "caFile" index constant + + + + + OPTION_CIPHERS + \ArangoDBClient\ConnectionOptions::OPTION_CIPHERS + 'ciphers' + + ciphers allowed to be used in SSL + + + + + OPTION_ENHANCED_TRACE + \ArangoDBClient\ConnectionOptions::OPTION_ENHANCED_TRACE + 'enhancedTrace' + + Enhanced trace + + + + + OPTION_CREATE + \ArangoDBClient\ConnectionOptions::OPTION_CREATE + 'createCollection' + + "Create collections if they don't exist" index constant + + + + + OPTION_REVISION + \ArangoDBClient\ConnectionOptions::OPTION_REVISION + 'rev' + + Update revision constant + + + + + OPTION_UPDATE_POLICY + \ArangoDBClient\ConnectionOptions::OPTION_UPDATE_POLICY + 'policy' + + Update policy index constant + + + + + OPTION_UPDATE_KEEPNULL + \ArangoDBClient\ConnectionOptions::OPTION_UPDATE_KEEPNULL + 'keepNull' + + Update keepNull constant + + + + + OPTION_REPLACE_POLICY + \ArangoDBClient\ConnectionOptions::OPTION_REPLACE_POLICY + 'policy' + + Replace policy index constant + + + + + OPTION_DELETE_POLICY + \ArangoDBClient\ConnectionOptions::OPTION_DELETE_POLICY + 'policy' + + Delete policy index constant + + + + + OPTION_WAIT_SYNC + \ArangoDBClient\ConnectionOptions::OPTION_WAIT_SYNC + 'waitForSync' + + Wait for sync index constant + + + + + OPTION_LIMIT + \ArangoDBClient\ConnectionOptions::OPTION_LIMIT + 'limit' + + Limit index constant + + + + + OPTION_SKIP + \ArangoDBClient\ConnectionOptions::OPTION_SKIP + 'skip' + + Skip index constant + - - $graph - - mixed - - - - replaceEdgeDefinition - \ArangoDBClient\GraphHandler::replaceEdgeDefinition() - - replaces an edge definition of the graph. - This will replace an edge definition in the graph.<br><br> - - \ArangoDBClient\Exception - - - mixed - - - \ArangoDBClient\EdgeDefinition - - - \ArangoDBClient\Graph - - + + + OPTION_BATCHSIZE + \ArangoDBClient\ConnectionOptions::OPTION_BATCHSIZE + 'batchSize' + + Batch size index constant + - - $graph - - mixed - - - $edgeDefinition - - \ArangoDBClient\EdgeDefinition - - - - saveVertex - \ArangoDBClient\GraphHandler::saveVertex() - - save a vertex to a graph - This will add the vertex-document to the graph and return the vertex id - -This will throw if the vertex cannot be saved<br><br> - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - string - - - string - - + + + OPTION_JOURNAL_SIZE + \ArangoDBClient\ConnectionOptions::OPTION_JOURNAL_SIZE + 'journalSize' + + Wait for sync index constant + - - $graph - - mixed - - - $document - - mixed - - - $collection - null - string - - - - getVertex - \ArangoDBClient\GraphHandler::getVertex() - - Get a single vertex from a graph - This will throw if the vertex cannot be fetched from the server<br><br> - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - array - - - string - - - \ArangoDBClient\Document - - + + + OPTION_IS_SYSTEM + \ArangoDBClient\ConnectionOptions::OPTION_IS_SYSTEM + 'isSystem' + + Wait for sync index constant + - - $graph - - mixed - - - $vertexId - - mixed - - - $options - array() - array - - - $collection - null - string - - - - hasVertex - \ArangoDBClient\GraphHandler::hasVertex() - - Check if a vertex exists - This will call self::getVertex() internally and checks if there -was an exception thrown which represents an 404 request. - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - boolean - + + + OPTION_IS_VOLATILE + \ArangoDBClient\ConnectionOptions::OPTION_IS_VOLATILE + 'isVolatile' + + Wait for sync index constant + - - $graph - - mixed - - - $vertexId - - mixed - - - - replaceVertex - \ArangoDBClient\GraphHandler::replaceVertex() - - Replace an existing vertex in a graph, identified graph name and vertex id - This will update the vertex on the server - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the to-be-replaced vertex is the same as the one given.<br><br> - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - \ArangoDBClient\Document - - - mixed - - - string - - - boolean - - + + + OPTION_AUTH_USER + \ArangoDBClient\ConnectionOptions::OPTION_AUTH_USER + 'AuthUser' + + Authentication user name + + + + + OPTION_AUTH_PASSWD + \ArangoDBClient\ConnectionOptions::OPTION_AUTH_PASSWD + 'AuthPasswd' + + Authentication password + + + + + OPTION_AUTH_TYPE + \ArangoDBClient\ConnectionOptions::OPTION_AUTH_TYPE + 'AuthType' + + Authentication type + + + + + OPTION_CONNECTION + \ArangoDBClient\ConnectionOptions::OPTION_CONNECTION + 'Connection' + + Connection + - - $graph - - mixed - - - $vertexId - - mixed - - - $document - - \ArangoDBClient\Document - - - $options - array() - mixed - - - $collection - null - string - - - - updateVertex - \ArangoDBClient\GraphHandler::updateVertex() - - Update an existing vertex in a graph, identified by graph name and vertex id - This will update the vertex on the server - -This will throw if the vertex cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed vertex-document has a _rev value set, the database will check -that the revision of the to-be-replaced document is the same as the one given.<br><br> - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - \ArangoDBClient\Document - - - mixed - - - string - - - boolean - - + + + OPTION_RECONNECT + \ArangoDBClient\ConnectionOptions::OPTION_RECONNECT + 'Reconnect' + + Reconnect flag + - - $graph - - mixed - - - $vertexId - - mixed - - - $document - - \ArangoDBClient\Document - - - $options - array() - mixed - - - $collection - null - string - - - - removeVertex - \ArangoDBClient\GraphHandler::removeVertex() - - Remove a vertex from a graph, identified by the graph name and vertex id<br><br> + + + OPTION_BATCH + \ArangoDBClient\ConnectionOptions::OPTION_BATCH + 'Batch' + + Batch flag - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - mixed - - - mixed - - - string - - - boolean - - - - $graph - - mixed - - - $vertexId - - mixed - - - $revision - null - mixed - - - $options - array() - mixed - - - $collection - null - string - - - - saveEdge - \ArangoDBClient\GraphHandler::saveEdge() - - save an edge to a graph - This will save the edge to the graph and return the edges-document's id - -This will throw if the edge cannot be saved<br><br> - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - mixed - - - mixed - - - mixed - - - string - - - mixed - - + + + OPTION_BATCHPART + \ArangoDBClient\ConnectionOptions::OPTION_BATCHPART + 'BatchPart' + + Batchpart flag + - - $graph - - mixed - - - $from - - mixed - - - $to - - mixed - - - $label - null - mixed - - - $document - - mixed - - - $collection - null - string - - - - getEdge - \ArangoDBClient\GraphHandler::getEdge() - - Get a single edge from a graph - This will throw if the edge cannot be fetched from the server<br><br> - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - array - - - string - - - \ArangoDBClient\Document - - + + + OPTION_DATABASE + \ArangoDBClient\ConnectionOptions::OPTION_DATABASE + 'database' + + Database flag + - - $graph - - mixed - - - $edgeId - - mixed - - - $options - array() - array - - - $collection - null - string - - - - hasEdge - \ArangoDBClient\GraphHandler::hasEdge() - - Check if an edge exists - This will call self::getEdge() internally and checks if there -was an exception thrown which represents an 404 request. - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - boolean - + + + OPTION_CHECK_UTF8_CONFORM + \ArangoDBClient\ConnectionOptions::OPTION_CHECK_UTF8_CONFORM + 'CheckUtf8Conform' + + UTF-8 CHeck Flag + - - $graph - - mixed - - - $edgeId - - mixed - - - - replaceEdge - \ArangoDBClient\GraphHandler::replaceEdge() - - Replace an existing edge in a graph, identified graph name and edge id - This will replace the edge on the server - -This will throw if the edge cannot be Replaced - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed document has a _rev value set, the database will check -that the revision of the to-be-replaced edge is the same as the one given.<br><br> - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - mixed - - - \ArangoDBClient\Edge - - - mixed - - - string - - - boolean - - + + + OPTION_MEMCACHED_SERVERS + \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_SERVERS + 'memcachedServers' + + Entry for memcached servers array + - - $graph - - mixed - - - $edgeId - - mixed - - - $label - - mixed - - - $document - - \ArangoDBClient\Edge - - - $options - array() - mixed - - - $collection - null - string - - - - updateEdge - \ArangoDBClient\GraphHandler::updateEdge() - - Update an existing edge in a graph, identified by graph name and edge id - This will update the edge on the server - -This will throw if the edge cannot be updated - -If policy is set to error (locally or globally through the ConnectionOptions) -and the passed edge-document has a _rev value set, the database will check -that the revision of the to-be-replaced document is the same as the one given.<br><br> - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - mixed - - - \ArangoDBClient\Edge - - - mixed - - - string - - - boolean - - + + + OPTION_MEMCACHED_OPTIONS + \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_OPTIONS + 'memcachedOptions' + + Entry for memcached options array + - - $graph - - mixed - - - $edgeId - - mixed - - - $label - - mixed - - - $document - - \ArangoDBClient\Edge - - - $options - array() - mixed - - - $collection - null - string - - - - removeEdge - \ArangoDBClient\GraphHandler::removeEdge() - - Remove a edge from a graph, identified by the graph name and edge id<br><br> + + + OPTION_MEMCACHED_ENDPOINTS_KEY + \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_ENDPOINTS_KEY + 'memcachedEndpointsKey' + + Entry for memcached endpoints key + + + + + OPTION_MEMCACHED_PERSISTENT_ID + \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_PERSISTENT_ID + 'memcachedPersistentId' + + Entry for memcached persistend id - - \ArangoDBClient\Exception - - - mixed - - - mixed - - - mixed - - - mixed - - - string - - - boolean - - - - $graph - - mixed - - - $edgeId - - mixed - - - $revision - null - mixed - - - $options - array() - mixed - - - $collection - null - string - - - - clearCache - \ArangoDBClient\GraphHandler::clearCache() - - Clears the GraphHandler's cache + + + OPTION_MEMCACHED_TTL + \ArangoDBClient\ConnectionOptions::OPTION_MEMCACHED_TTL + 'memcachedTtl' + + Entry for memcached cache ttl - - \ArangoDBClient\GraphHandler - - - - - getCacheEnabled - \ArangoDBClient\GraphHandler::getCacheEnabled() - - Checks if caching in enabled + + + OPTION_NOTIFY_CALLBACK + \ArangoDBClient\ConnectionOptions::OPTION_NOTIFY_CALLBACK + 'notifyCallback' + + Entry for notification callback - - boolean - - - - setCacheEnabled - \ArangoDBClient\GraphHandler::setCacheEnabled() - - + + + $_values + \ArangoDBClient\ConnectionOptions::_values + array() + + The current options - - boolean - - - \ArangoDBClient\GraphHandler + + array - - - $useCache - - boolean - - - - __construct - \ArangoDBClient\Handler::__construct() - - Construct a new handler + + + $_currentEndpointIndex + \ArangoDBClient\ConnectionOptions::_currentEndpointIndex + 0 + + The index into the endpoints array that we will connect to (or are currently +connected to). This index will be increased in case the currently connected +server tells us there is a different leader. We will then simply connect +to the new leader, adjusting this index. If we don't know the new leader +we will try the next server from the list of endpoints until we find the leader +or have tried to often - - \ArangoDBClient\Connection + + integer - - $connection - - \ArangoDBClient\Connection - - \ArangoDBClient\Handler - - - getConnection - \ArangoDBClient\Handler::getConnection() + + + $_cache + \ArangoDBClient\ConnectionOptions::_cache + null - Return the connection object + Optional Memcached instance for endpoints caching - - \ArangoDBClient\Connection + + \ArangoDBClient\Memcached - \ArangoDBClient\Handler - - - getConnectionOption - \ArangoDBClient\Handler::getConnectionOption() - - Return a connection option -This is a convenience function that calls json_encode_wrapper on the connection + + + __construct + \ArangoDBClient\ConnectionOptions::__construct() + + Set defaults, use options provided by client and validate them - - - mixed + + array - + \ArangoDBClient\ClientException - $optionName + $options - + array - \ArangoDBClient\Handler - - json_encode_wrapper - \ArangoDBClient\Handler::json_encode_wrapper() - - Return a json encoded string for the array passed. - This is a convenience function that calls json_encode_wrapper on the connection - + + getAll + \ArangoDBClient\ConnectionOptions::getAll() + + Get all options + + array - - string - - - \ArangoDBClient\ClientException - - - $body - - array - - \ArangoDBClient\Handler - - includeOptionsInBody - \ArangoDBClient\Handler::includeOptionsInBody() - - Helper function that runs through the options given and includes them into the parameters array given. - Only options that are set in $includeArray will be included. -This is only for options that are to be sent to the ArangoDB server in a json body(like 'limit', 'skip', etc...) . - - array + + offsetSet + \ArangoDBClient\ConnectionOptions::offsetSet() + + Set and validate a specific option, necessary for ArrayAccess + + + \ArangoDBClient\Exception - - array + + string - - array + + mixed - - array + + void - $options + $offset - array + string - $body + $value - array - - - $includeArray - array() - array + mixed - \ArangoDBClient\Handler - - makeCollection - \ArangoDBClient\Handler::makeCollection() - - Turn a value into a collection name + + offsetExists + \ArangoDBClient\ConnectionOptions::offsetExists() + + Check whether an option exists, necessary for ArrayAccess - - \ArangoDBClient\ClientException - - - mixed - - + string + + boolean + - $value + $offset - mixed + string - \ArangoDBClient\Handler - - setDocumentClass - \ArangoDBClient\DocumentClassable::setDocumentClass() - - Sets the document class to use + + offsetUnset + \ArangoDBClient\ConnectionOptions::offsetUnset() + + Remove an option and validate, necessary for ArrayAccess - + + \ArangoDBClient\Exception + + string - - \ArangoDBClient\DocumentClassable + + void - $class + $offset string - \ArangoDBClient\DocumentClassable - - setEdgeClass - \ArangoDBClient\DocumentClassable::setEdgeClass() - - Sets the edge class to use + + offsetGet + \ArangoDBClient\ConnectionOptions::offsetGet() + + Get a specific option, necessary for ArrayAccess - + + \ArangoDBClient\ClientException + + string - - \ArangoDBClient\DocumentClassable + + mixed - $class + $offset string - \ArangoDBClient\DocumentClassable - - - No summary for method setCacheEnabled() - - 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 - - - - ArangoDB PHP client: default values - - - - - - - - DefaultValues - \ArangoDBClient\DefaultValues - - Contains default values used by the client - <br> - - - - - DEFAULT_PORT - \ArangoDBClient\DefaultValues::DEFAULT_PORT - 8529 - - Default port number (used if no port specified) - - - - - DEFAULT_TIMEOUT - \ArangoDBClient\DefaultValues::DEFAULT_TIMEOUT - 30 - - Default timeout value (used if no timeout value specified) - - - - - DEFAULT_FAILOVER_TRIES - \ArangoDBClient\DefaultValues::DEFAULT_FAILOVER_TRIES - 3 - - Default number of failover servers to try (used in case there is an automatic failover) -if set to 0, then an unlimited amount of servers will be tried - - - - - DEFAULT_FAILOVER_TIMEOUT - \ArangoDBClient\DefaultValues::DEFAULT_FAILOVER_TIMEOUT - 30 - - Default max amount of time (in seconds) that is spent waiting on failover - - - - - DEFAULT_AUTH_TYPE - \ArangoDBClient\DefaultValues::DEFAULT_AUTH_TYPE - 'Basic' - - Default Authorization type (use HTTP basic authentication) - - - - - DEFAULT_WAIT_SYNC - \ArangoDBClient\DefaultValues::DEFAULT_WAIT_SYNC - false - - Default value for waitForSync (fsync all data to disk on document updates/insertions/deletions) - - - - - DEFAULT_JOURNAL_SIZE - \ArangoDBClient\DefaultValues::DEFAULT_JOURNAL_SIZE - 33554432 - - Default value for collection journal size - - - - - DEFAULT_IS_VOLATILE - \ArangoDBClient\DefaultValues::DEFAULT_IS_VOLATILE - false - - Default value for isVolatile + + getCurrentEndpoint + \ArangoDBClient\ConnectionOptions::getCurrentEndpoint() + + Get the current endpoint to use + + string + - - - DEFAULT_CREATE - \ArangoDBClient\DefaultValues::DEFAULT_CREATE - false - - Default value for createCollection (create the collection on the fly when the first document is added to an unknown collection) + + + haveMultipleEndpoints + \ArangoDBClient\ConnectionOptions::haveMultipleEndpoints() + + Whether or not we have multiple endpoints to connect to + + boolean + - - - DEFAULT_CONNECTION - \ArangoDBClient\DefaultValues::DEFAULT_CONNECTION - 'Keep-Alive' - - Default value for HTTP Connection header + + + addEndpoint + \ArangoDBClient\ConnectionOptions::addEndpoint() + + Add a new endpoint to the list of endpoints +if the endpoint is already in the list, it will not be added again +as a side-effect, this method will modify _currentEndpointIndex + + string + + + void + - - - DEFAULT_VERIFY_CERT - \ArangoDBClient\DefaultValues::DEFAULT_VERIFY_CERT - false - - Default value for SSL certificate verification + + $endpoint + + string + + + + nextEndpoint + \ArangoDBClient\ConnectionOptions::nextEndpoint() + + Return the next endpoint from the list of endpoints +As a side-effect this function switches to a new endpoint + + string + - - - DEFAULT_VERIFY_CERT_NAME - \ArangoDBClient\DefaultValues::DEFAULT_VERIFY_CERT_NAME - false - - Default value for SSL certificate host name verification + + + getDefaults + \ArangoDBClient\ConnectionOptions::getDefaults() + + Get the default values for the options + + array + - - - DEFAULT_ALLOW_SELF_SIGNED - \ArangoDBClient\DefaultValues::DEFAULT_ALLOW_SELF_SIGNED - true - - Default value for accepting self-signed SSL certificates + + + getSupportedAuthTypes + \ArangoDBClient\ConnectionOptions::getSupportedAuthTypes() + + Return the supported authorization types + + array + - - - DEFAULT_CIPHERS - \ArangoDBClient\DefaultValues::DEFAULT_CIPHERS - null - - Default value for ciphers to be used in SSL + + + getSupportedConnectionTypes + \ArangoDBClient\ConnectionOptions::getSupportedConnectionTypes() + + Return the supported connection types + + array + - - - DEFAULT_UPDATE_POLICY - \ArangoDBClient\DefaultValues::DEFAULT_UPDATE_POLICY - \ArangoDBClient\UpdatePolicy::ERROR - - Default update policy + + + validate + \ArangoDBClient\ConnectionOptions::validate() + + Validate the options + + \ArangoDBClient\ClientException + + + void + - - - DEFAULT_REPLACE_POLICY - \ArangoDBClient\DefaultValues::DEFAULT_REPLACE_POLICY - \ArangoDBClient\UpdatePolicy::ERROR - - Default replace policy + + + loadOptionsFromCache + \ArangoDBClient\ConnectionOptions::loadOptionsFromCache() + + load and merge connection options from optional Memcached cache into +ihe current settings + + void + - - - DEFAULT_DELETE_POLICY - \ArangoDBClient\DefaultValues::DEFAULT_DELETE_POLICY - \ArangoDBClient\UpdatePolicy::ERROR - - Default delete policy + + + storeOptionsInCache + \ArangoDBClient\ConnectionOptions::storeOptionsInCache() + + store the updated options in the optional Memcached cache + + void + - - - DEFAULT_CHECK_UTF8_CONFORM - \ArangoDBClient\DefaultValues::DEFAULT_CHECK_UTF8_CONFORM - false - - Default value for checking if data is UTF-8 conform + + + getEndpointsCache + \ArangoDBClient\ConnectionOptions::getEndpointsCache() + + Initialize and return a memcached cache instance, +if option "memcachedServers" is set + + \ArangoDBClient\Memcached + - + - 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 - + From f5dfddf12b7bc8476318c9606d03229f970be3f4 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 19 Aug 2019 14:25:54 +0200 Subject: [PATCH 024/101] added 3.5 badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fbe690d6..4661dff5 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ The official ArangoDB PHP Driver. 3.2: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.2)](https://travis-ci.org/arangodb/arangodb-php) 3.3: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.3)](https://travis-ci.org/arangodb/arangodb-php) 3.4: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.4)](https://travis-ci.org/arangodb/arangodb-php) +3.5: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.5)](https://travis-ci.org/arangodb/arangodb-php) +devel: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=devel)](https://travis-ci.org/arangodb/arangodb-php) devel: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=devel)](https://travis-ci.org/arangodb/arangodb-php) - [Getting Started](docs/Drivers/PHP/GettingStarted/README.md) From fcd2ce451ab80bc29116e5c50b1bedcd7697c19f Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 19 Aug 2019 14:27:12 +0200 Subject: [PATCH 025/101] oops --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 4661dff5..1b86fa36 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ The official ArangoDB PHP Driver. 3.4: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.4)](https://travis-ci.org/arangodb/arangodb-php) 3.5: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.5)](https://travis-ci.org/arangodb/arangodb-php) devel: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=devel)](https://travis-ci.org/arangodb/arangodb-php) -devel: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=devel)](https://travis-ci.org/arangodb/arangodb-php) - [Getting Started](docs/Drivers/PHP/GettingStarted/README.md) - [Tutorial](docs/Drivers/PHP/Tutorial/README.md) From 54f7800f9297507b3a3f2d9ba0be27597a67bb2c Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 23 Sep 2019 11:03:21 +0200 Subject: [PATCH 026/101] don't execute test in cluster --- tests/TransactionTest.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/TransactionTest.php b/tests/TransactionTest.php index 5418cfba..98a76950 100644 --- a/tests/TransactionTest.php +++ b/tests/TransactionTest.php @@ -68,8 +68,9 @@ public function setUp() */ public function testDeadlockHandling() { - if (!$this->isMMFilesEngine) { - $this->markTestSkipped("test is only meaningful with the mmfiles engine"); + if (!$this->isMMFilesEngine || isCluster($this->connection)) { + $this->markTestSkipped("test is only meaningful with the mmfiles engine, single server"); + return; } try { From cb3ae42fd17920f751d1909011e378960c420dc6 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 4 Oct 2019 19:08:29 +0200 Subject: [PATCH 027/101] fix test expectations --- tests/GraphBasicTest.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/GraphBasicTest.php b/tests/GraphBasicTest.php index 8e3896b2..ee50305a 100644 --- a/tests/GraphBasicTest.php +++ b/tests/GraphBasicTest.php @@ -212,7 +212,7 @@ public function testAddGetDeleteCollections() } catch (\Exception $e) { $error = $e->getMessage(); } - static::assertSame('not in orphan collection', $error); + static::assertRegExp('/orphan collection/', $error); $error = null; try { @@ -221,7 +221,7 @@ public function testAddGetDeleteCollections() $error = $e->getMessage(); } - static::assertSame('not a vertex collection', $error); + static::assertRegExp('/not a vertex collection/', $error); $error = null; try { @@ -292,7 +292,7 @@ public function testAddGetDeleteCollectionsWithCache() } catch (\Exception $e) { $error = $e->getMessage(); } - static::assertSame('not in orphan collection', $error); + static::assertRegExp('/orphan collection/', $error); $error = null; try { @@ -300,8 +300,7 @@ public function testAddGetDeleteCollectionsWithCache() } catch (\Exception $e) { $error = $e->getMessage(); } - - static::assertSame('not a vertex collection', $error); + static::assertRegExp('/not a vertex collection/', $error); $error = null; try { From 118a879acacd044b2ac1b2602c80284e87a2944d Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 2 Dec 2019 11:09:05 +0100 Subject: [PATCH 028/101] changes for ArangoDB 3.6 --- CHANGELOG.md | 13 +++ lib/ArangoDBClient/Collection.php | 65 ++++++++++---- lib/ArangoDBClient/CollectionHandler.php | 8 +- lib/ArangoDBClient/Database.php | 21 ++++- lib/ArangoDBClient/Statement.php | 45 +++++++++- tests/CollectionBasicTest.php | 10 +-- tests/DatabaseTest.php | 108 ++++++++++++++++++++++- tests/StatementTest.php | 31 +++++++ 8 files changed, 267 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c513fb0a..a1f7cec0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +Release notes for the ArangoDB-PHP driver 3.6.x +=============================================== + +Deprecated `Collection::setMinReplicationFactor()` and `Collection::getMinReplicationFactor()` +in favor of `Collection::setWriteConcern()` and `Collection::getWriteConcern()`. + +Added support for per-database default options (`replicationFactor`, `writeConcern` and +`sharding`). + +Added `maxRuntime` option to `Statement` class for automatically timing out queries on +the server-side. + + Release notes for the ArangoDB-PHP driver 3.5.x =============================================== diff --git a/lib/ArangoDBClient/Collection.php b/lib/ArangoDBClient/Collection.php index 9c34dcea..c7c484fb 100644 --- a/lib/ArangoDBClient/Collection.php +++ b/lib/ArangoDBClient/Collection.php @@ -91,11 +91,11 @@ class Collection private $_replicationFactor; /** - * The minimum replicationFactor value for writes to be successful + * The write concern for writes to be considered successful * - * @var mixed - minimum replicationFactor value + * @var mixed - write concern value */ - private $_minReplicationFactor; + private $_writeConcern; /** * The shardingStrategy value (might be NULL for new collections) @@ -193,9 +193,14 @@ class Collection const ENTRY_REPLICATION_FACTOR = 'replicationFactor'; /** - * Collection 'minReplicationFactor' index + * Collection 'writeConcern' index */ - const ENTRY_MIN_REPLICATION_FACTOR = 'minReplicationFactor'; + const ENTRY_WRITE_CONCERN = 'writeConcern'; + + /** + * Collection 'sharding' index + */ + const ENTRY_SHARDING = 'sharding'; /** * Collection 'shardingStrategy' index @@ -316,7 +321,7 @@ public function __clone() $this->_distributeShardsLike = null; $this->_numberOfShards = null; $this->_replicationFactor = null; - $this->_minReplicationFactor = null; + $this->_writeConcern = null; $this->_shardingStrategy = null; $this->_shardKeys = null; $this->_smartJoinAttribute = null; @@ -387,8 +392,8 @@ public function getAll() $result[self::ENTRY_REPLICATION_FACTOR] = $this->_replicationFactor; } - if (null !== $this->_minReplicationFactor) { - $result[self::ENTRY_MIN_REPLICATION_FACTOR] = $this->_minReplicationFactor; + if (null !== $this->_writeConcern) { + $result[self::ENTRY_WRITE_CONCERN] = $this->_writeConcern; } if (null !== $this->_shardingStrategy) { @@ -487,8 +492,8 @@ public function set($key, $value) return; } - if ($key === self::ENTRY_MIN_REPLICATION_FACTOR) { - $this->setMinReplicationFactor($value); + if ($key === self::ENTRY_WRITE_CONCERN) { + $this->setWriteConcern($value); return; } @@ -850,26 +855,50 @@ public function getReplicationFactor() } /** - * Set the minReplicationFactor value + * Set the write concern value * - * @param int $value - minReplicationFactor value + * @param int $value - write concern value * * @return void */ - public function setMinReplicationFactor($value) + public function setWriteConcern($value) { assert(null === $value || is_numeric($value)); - $this->_minReplicationFactor = $value; + $this->_writeConcern = $value; + } + + /** + * Set the write concern value + * + * @param int $value - write concern value + * + * @deprecated use setWriteConcern instead + * @return void + */ + public function setMinReplicationFactor($value) + { + $this->setWriteConcern($value); } /** - * Get the minReplicationFactor value (if already known) + * Get the write concern value (if already known) + * + * @return mixed - write concern value + */ + public function getWriteConcern() + { + return $this->_writeConcern; + } + + /** + * Get the write concern value (if already known). this is an alias only * - * @return mixed - minReplicationFactor value + * @deprecated use getWriteConcern instead + * @return mixed - write concern value */ - public function getMinReplicationFactor() + public function getMinReplicationFactor() { - return $this->_minReplicationFactor; + return $this->getWriteConcern(); } /** diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index 63e2471c..3a05be9e 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -243,7 +243,7 @@ class CollectionHandler extends Handler * * @param mixed $collection - collection object to be created on the server or a string with the name * @param array $options - an array of options. - *

    Options are :
    + *

    Options are:
    *

  • 'type' - 2 -> normal collection, 3 -> edge-collection
  • *
  • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
  • *
  • 'journalSize' - journalSize value.
  • @@ -253,7 +253,7 @@ class CollectionHandler extends Handler *
  • 'distributeShardsLike' - name of prototype collection for identical sharding.
  • *
  • 'numberOfShards' - number of shards for the collection.
  • *
  • 'replicationFactor' - number of replicas to keep (default: 1).
  • - *
  • 'minReplicationFactor' - minimum number of replicas to be successful when writing (default: 1).
  • + *
  • 'writeConcern' - minimum number of replicas to be successful when writing (default: 1).
  • *
  • 'shardKeys' - array of shard key attributes.
  • *
  • 'shardingStrategy' - sharding strategy to use in cluster.
  • *
  • 'smartJoinAttribute' - attribute name for smart joins (if not shard key).
  • @@ -311,8 +311,8 @@ public function create($collection, array $options = []) $params[Collection::ENTRY_REPLICATION_FACTOR] = $collection->getReplicationFactor(); } - if ($collection->getMinReplicationFactor() !== null) { - $params[Collection::ENTRY_MIN_REPLICATION_FACTOR] = $collection->getMinReplicationFactor(); + if ($collection->getWriteConcern() !== null) { + $params[Collection::ENTRY_WRITE_CONCERN] = $collection->getWriteConcern(); } if ($collection->getShardingStrategy() !== null) { diff --git a/lib/ArangoDBClient/Database.php b/lib/ArangoDBClient/Database.php index b7584410..6a151494 100644 --- a/lib/ArangoDBClient/Database.php +++ b/lib/ArangoDBClient/Database.php @@ -31,6 +31,11 @@ class Database * Users index */ const ENTRY_DATABASE_USERS = 'users'; + + /** + * Options index + */ + const ENTRY_OPTIONS = 'options'; /** * creates a database @@ -38,7 +43,12 @@ class Database * This creates a new database
    * * @param Connection $connection - the connection to be used - * @param string $name - the database specification, for example 'myDatabase' + * @param string $name - database name, for example 'myDatabase' + * @param array $options - extra options for new collections in this database. + *

    Options are :
    + *

  • 'replicationFactor'
  • + *
  • 'writeConcern'
  • + *
  • 'sharding'
  • * * @link https://docs.arangodb.com/HTTP/Database/index.html * @@ -46,7 +56,7 @@ class Database * @throws \ArangoDBClient\Exception * @throws \ArangoDBClient\ClientException */ - public static function create(Connection $connection, $name) + public static function create(Connection $connection, $name, array $options = []) { $payload = [ self::ENTRY_DATABASE_NAME => $name, @@ -55,9 +65,13 @@ public static function create(Connection $connection, $name) 'username' => $connection->getOption(ConnectionOptions::OPTION_AUTH_USER), 'passwd' => $connection->getOption(ConnectionOptions::OPTION_AUTH_PASSWD) ] - ] + ], ]; + if (count($options) > 0) { + $payload[self::ENTRY_OPTIONS] = $options; + } + $response = $connection->post(Urls::URL_DATABASE, $connection->json_encode_wrapper($payload)); return $response->getJson(); @@ -142,7 +156,6 @@ public static function databases(Connection $connection) */ public static function listUserDatabases(Connection $connection) { - $url = UrlHelper::buildUrl(Urls::URL_DATABASE, ['user']); $response = $connection->get($url); diff --git a/lib/ArangoDBClient/Statement.php b/lib/ArangoDBClient/Statement.php index c071d205..52a9dc7e 100644 --- a/lib/ArangoDBClient/Statement.php +++ b/lib/ArangoDBClient/Statement.php @@ -135,6 +135,14 @@ class Statement */ private $_ttl; + /** + * Number of seconds after which the query will automatically be terminated on the + * server + * + * @var double + */ + private $_maxRuntime; + /** * Whether or not the cache should abort when it encounters a warning * @@ -213,6 +221,11 @@ class Statement * TTL attribute */ const ENTRY_TTL = 'ttl'; + + /** + * maxRuntime attribute + */ + const ENTRY_MAX_RUNTIME = 'maxRuntime'; /** * transaction attribute (used internally) @@ -263,6 +276,10 @@ public function __construct(Connection $connection, array $data) if (isset($data[self::ENTRY_TTL])) { $this->setTtl($data[self::ENTRY_TTL]); } + + if (isset($data[self::ENTRY_MAX_RUNTIME])) { + $this->setMaxRuntime($data[self::ENTRY_MAX_RUNTIME]); + } if (isset($data[self::ENTRY_BINDVARS])) { $this->_bindVars->set($data[self::ENTRY_BINDVARS]); @@ -553,6 +570,28 @@ public function getTtl() return $this->_ttl; } + /** + * Set the max runtime option for the statement + * + * @param double $value - value for maximum runtime option + * + * @return void + */ + public function setMaxRuntime($value) + { + $this->_maxRuntime = (double) $value; + } + + /** + * Get the max runtime option value of the statement + * + * @return double - current value of max runtime option + */ + public function getMaxRuntime() + { + return $this->_maxRuntime; + } + /** * Set the streaming option for the statement * @@ -698,10 +737,14 @@ private function buildData() $data['options'][self::ENTRY_STREAM] = $this->_stream; } + if ($this->_maxRuntime !== null) { + $data['options'][self::ENTRY_MAX_RUNTIME] = $this->_maxRuntime; + } + if ($this->_ttl !== null) { $data[self::ENTRY_TTL] = $this->_ttl; } - + if ($this->_cache !== null) { $data[Cursor::ENTRY_CACHE] = $this->_cache; } diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 0b9d715b..48bd5d72 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -312,8 +312,8 @@ public function testCreateCollectionWithReplicationFactor1() } $collection->setName($name); - $collection->setMinReplicationFactor(1); $collection->setReplicationFactor(1); + $collection->setWriteConcern(1); $response = $collectionHandler->create($collection); @@ -321,7 +321,7 @@ public function testCreateCollectionWithReplicationFactor1() $properties = $resultingCollection->getAll(); static::assertEquals(1, $properties[Collection::ENTRY_REPLICATION_FACTOR]); - static::assertEquals(1, $properties[Collection::ENTRY_MIN_REPLICATION_FACTOR]); + static::assertEquals(1, $properties[Collection::ENTRY_WRITE_CONCERN]); } @@ -349,8 +349,8 @@ public function testCreateCollectionWithReplicationFactor2() } $collection->setName($name); - $collection->setMinReplicationFactor(2); $collection->setReplicationFactor(2); + $collection->setWriteConcern(2); $response = $collectionHandler->create($collection); @@ -358,7 +358,7 @@ public function testCreateCollectionWithReplicationFactor2() $properties = $resultingCollection->getAll(); static::assertEquals(2, $properties[Collection::ENTRY_REPLICATION_FACTOR]); - static::assertEquals(2, $properties[Collection::ENTRY_MIN_REPLICATION_FACTOR]); + static::assertEquals(2, $properties[Collection::ENTRY_WRITE_CONCERN]); } /** @@ -399,7 +399,7 @@ public function testCreateCollectionWithReplicationFactorSatellite() $properties = $resultingCollection->getAll(); static::assertEquals("satellite", $properties[Collection::ENTRY_REPLICATION_FACTOR]); - static::assertEquals(0, $properties[Collection::ENTRY_MIN_REPLICATION_FACTOR]); + static::assertEquals(0, $properties[Collection::ENTRY_WRITE_CONCERN]); } diff --git a/tests/DatabaseTest.php b/tests/DatabaseTest.php index 758991dc..d94ffd1b 100644 --- a/tests/DatabaseTest.php +++ b/tests/DatabaseTest.php @@ -32,6 +32,7 @@ public function __construct($name = null, array $data = [], $dataName = '') public function setUp() { $this->connection = getConnection(); + $this->connection->setDatabase('_system'); // remove existing databases to make test repeatable $databases = ['ArangoTestSuiteDatabaseTest01' . '_' . static::$testsTimestamp, 'ArangoTestSuiteDatabaseTest02' . '_' . static::$testsTimestamp]; @@ -49,7 +50,6 @@ public function setUp() */ public function testCreateDatabaseDeleteIt() { - $database = 'ArangoTestSuiteDatabaseTest01' . '_' . static::$testsTimestamp; try { @@ -85,7 +85,6 @@ public function testCreateDatabaseDeleteIt() */ public function testCreateDatabaseGetListOfDatabasesAndDeleteItAgain() { - $database = 'ArangoTestSuiteDatabaseTest01' . '_' . static::$testsTimestamp; $response = Database::create($this->connection, $database); @@ -156,6 +155,109 @@ public function testCreateDatabaseGetInfoOfDatabasesAndDeleteItAgain() false, $response['error'], 'result[\'error\'] Did not return false, instead returned: ' . print_r($response, 1) ); } + + + /** + * Test create database with options + */ + public function testCreateDatabaseWithOptions() + { + if (!isCluster($this->connection)) { + // only execute this test in a cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + $database = 'ArangoTestSuiteDatabaseTest01' . '_' . static::$testsTimestamp; + + try { + $e = null; + Database::delete($this->connection, $database); + } catch (\Exception $e) { + // don't bother us... just give us the $e + } + + $options = [ + Collection::ENTRY_REPLICATION_FACTOR => 2, + Collection::ENTRY_WRITE_CONCERN => 2 + ]; + + $response = Database::create($this->connection, $database, $options); + + static::assertEquals( + false, + $response['error'], + 'result[\'error\'] Did not return false, instead returned: ' . print_r($response, 1) + ); + + $this->connection->setDatabase($database); + + $response = Database::getInfo($this->connection); + $result = $response['result']; + + static::assertFalse($result['isSystem']); + static::assertEquals($database, $result['name']); + static::assertEquals("", $result['sharding']); + static::assertEquals(2, $result['replicationFactor']); + static::assertEquals(2, $result['writeConcern']); + + $this->connection->setDatabase('_system'); + Database::delete($this->connection, $database); + } + + /** + * Test create database with options + */ + public function testCreateDatabaseWithMoreOptions() + { + if (!isCluster($this->connection)) { + // only execute this test in a cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + if (!isEnterprise($this->connection)) { + // only execute this test in enterprise edition + $this->markTestSkipped("test is only meaningful in enterprise edition"); + return; + } + + $database = 'ArangoTestSuiteDatabaseTest01' . '_' . static::$testsTimestamp; + + try { + $e = null; + Database::delete($this->connection, $database); + } catch (\Exception $e) { + // don't bother us... just give us the $e + } + + $options = [ + Collection::ENTRY_REPLICATION_FACTOR => 2, + Collection::ENTRY_WRITE_CONCERN => 1, + Collection::ENTRY_SHARDING => "single" + ]; + + $response = Database::create($this->connection, $database, $options); + + static::assertEquals( + false, + $response['error'], + 'result[\'error\'] Did not return false, instead returned: ' . print_r($response, 1) + ); + + $this->connection->setDatabase($database); + + $response = Database::getInfo($this->connection); + $result = $response['result']; + + static::assertFalse($result['isSystem']); + static::assertEquals($database, $result['name']); + static::assertEquals("single", $result['sharding']); + static::assertEquals(2, $result['replicationFactor']); + static::assertEquals(1, $result['writeConcern']); + + $this->connection->setDatabase('_system'); + Database::delete($this->connection, $database); + } /** @@ -249,6 +351,8 @@ public function testCreateDatabaseSwitchToItAndCreateAnotherOne() public function tearDown() { + $this->connection->setDatabase('_system'); + // clean up $databases = ['ArangoTestSuiteDatabaseTest01' . '_' . static::$testsTimestamp, 'ArangoTestSuiteDatabaseTest02' . '_' . static::$testsTimestamp]; foreach ($databases as $database) { diff --git a/tests/StatementTest.php b/tests/StatementTest.php index 58875b35..716d2795 100644 --- a/tests/StatementTest.php +++ b/tests/StatementTest.php @@ -498,6 +498,37 @@ public function testTtl() static::assertTrue($excepted); } + public function testMaxRuntime() + { + $connection = $this->connection; + + $statement = new Statement( + $connection, [ 'query' => 'FOR i IN 1..1 RETURN SLEEP(0.1)' ] + ); + static::assertNull($statement->getMaxRuntime()); + + $cursor = $statement->execute(); + + $statement = new Statement( + $connection, [ + 'query' => 'FOR i IN 1..10 RETURN SLEEP(1)', + 'maxRuntime' => 2 + ] + ); + + static::assertEquals(2, $statement->getMaxRuntime()); + + $excepted = false; + try { + $statement->execute(); + } catch (ServerException $e) { + static::assertEquals(1500, $e->getServerCode()); + $excepted = true; + } + + static::assertTrue($excepted); + } + public function testStatementStreaming() { $connection = $this->connection; From e62465759d35232504f10bd15cadcd28c660df00 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 2 Dec 2019 11:33:42 +0100 Subject: [PATCH 029/101] fix version --- tests/travis/setup_arangodb.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index 8193ec06..8a57af44 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -35,8 +35,8 @@ echo "./phpunit --version" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $DIR -docker pull arangodb/arangodb-preview:3.5.0-rc.7 -docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:3.5.0-rc.7 +docker pull arangodb/arangodb-preview:devel-nightly +docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:devel-nightly sleep 2 From d331f1a493772960c4d0e3d1fb753900eb181ce2 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 2 Dec 2019 14:11:34 +0100 Subject: [PATCH 030/101] added custom analyzers support --- CHANGELOG.md | 2 + lib/ArangoDBClient/Analyzer.php | 128 +++++++++++++ lib/ArangoDBClient/AnalyzerHandler.php | 145 +++++++++++++++ lib/ArangoDBClient/Urls.php | 5 + lib/ArangoDBClient/View.php | 2 +- tests/AnalyzerTest.php | 237 +++++++++++++++++++++++++ tests/ViewTest.php | 44 ++--- 7 files changed, 540 insertions(+), 23 deletions(-) create mode 100644 lib/ArangoDBClient/Analyzer.php create mode 100644 lib/ArangoDBClient/AnalyzerHandler.php create mode 100644 tests/AnalyzerTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index a1f7cec0..85f6f2ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ Added support for per-database default options (`replicationFactor`, `writeConce Added `maxRuntime` option to `Statement` class for automatically timing out queries on the server-side. +Added support for custom analyzers for arangosearch. + Release notes for the ArangoDB-PHP driver 3.5.x =============================================== diff --git a/lib/ArangoDBClient/Analyzer.php b/lib/ArangoDBClient/Analyzer.php new file mode 100644 index 00000000..adbe5f4c --- /dev/null +++ b/lib/ArangoDBClient/Analyzer.php @@ -0,0 +1,128 @@ + + * + * @package ArangoDBClient + * @since 3.6 + */ +class Analyzer +{ + /** + * The analyzer name + * + * @var string - analyzer name + */ + protected $_name; + + /** + * Analyzer name index + */ + const ENTRY_NAME = 'name'; + + /** + * Analyzer type index + */ + const ENTRY_TYPE = 'type'; + + /** + * Analyzer properties index + */ + const ENTRY_PROPERTIES = 'properties'; + + /** + * Analyzer features index + */ + const ENTRY_FEATURES = 'features'; + + /** + * Constructs an analyzer + * + * @param string $name - analyzer name + * @param string $type - analyzer type + * @param array $properties - analyzer properties + * @param array $features - analyzer features + * + * @since 3.6 + * + * @throws \ArangoDBClient\ClientException + */ + public function __construct($name, $type, array $properties = [], array $features = []) + { + $this->_name = $name; + $this->_type = $type; + $this->_properties = $properties; + $this->_features = $features; + } + + /** + * Return the analyzer name + * + * @return string - analyzer name + */ + public function getName() + { + return $this->_name; + } + + /** + * Return the analyzer type + * + * @return string - analyzer type + */ + public function getType() + { + return $this->_type; + } + + /** + * Return the analyzer properties + * + * @return array - analyzer properties + */ + public function getProperties() + { + return $this->_properties; + } + + /** + * Return the analyzer features + * + * @return array - analyzer features + */ + public function getFeatures() + { + return $this->_features; + } + + /** + * Return the analyzer as an array + * + * @return array - analyzer data as an array + */ + public function getAll() + { + return [ + self::ENTRY_NAME => $this->getName(), + self::ENTRY_TYPE => $this->getType(), + self::ENTRY_PROPERTIES => $this->getProperties(), + self::ENTRY_FEATURES => $this->getFeatures(), + ]; + } +} + +class_alias(Analyzer::class, '\triagens\ArangoDb\Analyzer'); diff --git a/lib/ArangoDBClient/AnalyzerHandler.php b/lib/ArangoDBClient/AnalyzerHandler.php new file mode 100644 index 00000000..19dfc54c --- /dev/null +++ b/lib/ArangoDBClient/AnalyzerHandler.php @@ -0,0 +1,145 @@ +
    + * + * @throws Exception + * + * @param Analyzer $analyzer - The analyzer object which holds the information of the analyzer to be created + * + * @return array + * @since 3.6 + */ + public function create(Analyzer $analyzer) + { + $params = [ + Analyzer::ENTRY_NAME => $analyzer->getName(), + Analyzer::ENTRY_TYPE => $analyzer->getType(), + Analyzer::ENTRY_FEATURES => $analyzer->getFeatures(), + ]; + + $properties = $analyzer->getProperties(); + if (count($properties) > 0) { + $params[Analyzer::ENTRY_PROPERTIES] = $properties; + } + + $url = Urls::URL_ANALYZER; + $response = $this->getConnection()->post($url, $this->json_encode_wrapper($params)); + $json = $response->getJson(); + + return $analyzer->getAll(); + } + + /** + * Get an analyzer + * + * This will get an analyzer.

    + * + * @param string $analyzer - The name of the analyzer + * + * @return Analyzer|false + * @throws \ArangoDBClient\ClientException + * @since 3.6 + */ + public function get($analyzer) + { + $url = UrlHelper::buildUrl(Urls::URL_ANALYZER, [$analyzer]); + + $response = $this->getConnection()->get($url); + $data = $response->getJson(); + + $result = new Analyzer( + $data[Analyzer::ENTRY_NAME], + $data[Analyzer::ENTRY_TYPE], + $data[Analyzer::ENTRY_PROPERTIES], + $data[Analyzer::ENTRY_FEATURES] + ); + + return $result; + } + + /** + * Get all analyzers

    + * + * @throws Exception + * + * @return array - Returns an array of available analyzers + * @since 3.6 + */ + public function getAll() + { + $url = UrlHelper::buildUrl(Urls::URL_ANALYZER, []); + $result = $this->getConnection()->get($url); + + return $result->getJson(); + } + + /** + * Get an analyzer's properties

    + * + * @throws Exception + * + * @param mixed $analyzer - analyzer name as a string or instance of Analyzer + * + * @return array - Returns an array of attributes. Will throw if there is an error + * @since 3.6 + */ + public function properties($analyzer) + { + if ($analyzer instanceof Analyzer) { + $analyzer = $analyzer->getName(); + } + + $url = UrlHelper::buildUrl(Urls::URL_ANALYZER, [$analyzer]); + $result = $this->getConnection()->get($url); + + return $result->getJson(); + } + + /** + * Drop an analyzer

    + * + * @throws Exception + * + * @param mixed $analyzer- analyzer name as a string or instance of Analyzer + * + * @return bool - always true, will throw if there is an error + * @since 3.6 + */ + public function drop($analyzer) + { + if ($analyzer instanceof Analyzer) { + $analyzer = $analyzer->getName(); + } + + $url = UrlHelper::buildUrl(Urls::URL_ANALYZER, [$analyzer]); + $this->getConnection()->delete($url); + + return true; + } + +} + +class_alias(AnalyzerHandler::class, '\triagens\ArangoDb\AnalyzerHandler'); diff --git a/lib/ArangoDBClient/Urls.php b/lib/ArangoDBClient/Urls.php index fd639f37..5b1e7c9d 100644 --- a/lib/ArangoDBClient/Urls.php +++ b/lib/ArangoDBClient/Urls.php @@ -42,6 +42,11 @@ abstract class Urls * URL base part for all view-related REST calls */ const URL_VIEW = '/_api/view'; + + /** + * URL base part for all analyzer-related REST calls + */ + const URL_ANALYZER = '/_api/analyzer'; /** * URL part vertex-related graph REST calls diff --git a/lib/ArangoDBClient/View.php b/lib/ArangoDBClient/View.php index 159051f3..00cc7499 100644 --- a/lib/ArangoDBClient/View.php +++ b/lib/ArangoDBClient/View.php @@ -54,7 +54,7 @@ class View /** * Constructs an empty view * - * @param array $name - name for view + * @param string $name - name for view * @param string $type - view type * * @since 3.4 diff --git a/tests/AnalyzerTest.php b/tests/AnalyzerTest.php new file mode 100644 index 00000000..f7bec85b --- /dev/null +++ b/tests/AnalyzerTest.php @@ -0,0 +1,237 @@ +connection = getConnection(); + $this->analyzerHandler = new AnalyzerHandler($this->connection); + } + + /** + * Test creation of analyzer + */ + public function testCreateAnalyzerObject() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'text', [ "locale" => "en.UTF-8", "stopwords" => [] ]); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $analyzer->getName()); + static::assertEquals('text', $analyzer->getType()); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + } + + /** + * Test creation of identity analyzer + */ + public function testCreateIdentityAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'identity'); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('identity', $result['type']); + static::assertEquals([],$analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + } + + /** + * Test creation of text analyzer + */ + public function testCreateTextAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'text', [ "locale" => "en.UTF-8", "stopwords" => [] ]); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('text', $result['type']); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + } + + /** + * Test creation of text analyzer + */ + public function testCreateTextAnalyzerFail() + { + try { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'text'); + $this->analyzerHandler->create($analyzer); + } catch (\Exception $exception) { + } + static::assertEquals(400, $exception->getCode()); + } + + /** + * Test getting an analyzer + */ + public function testGetAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'text', [ "locale" => "en.UTF-8", "stopwords" => [] ]); + $this->analyzerHandler->create($analyzer); + + $result = $this->analyzerHandler->get('Analyzer1' . '_' . static::$testsTimestamp); + static::assertEquals('_system::Analyzer1' . '_' . static::$testsTimestamp, $result->getName()); + static::assertEquals('text', $result->getType()); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + } + + /** + * Test getting default analyzers + */ + public function testGetDefaultAnalyzers() + { + $result = $this->analyzerHandler->getAll(); + static::assertFalse($result['error']); + + $analyzers = $result['result']; + static::assertTrue(count($analyzers) > 0); + + $found = []; + foreach ($analyzers as $analyzer) { + $name = $analyzer['name']; + $found[] = $name; + } + + static::assertTrue(in_array('text_fi', $found)); + static::assertTrue(in_array('text_ru', $found)); + static::assertTrue(in_array('text_de', $found)); + static::assertTrue(in_array('text_en', $found)); + static::assertTrue(in_array('text_pt', $found)); + static::assertTrue(in_array('text_nl', $found)); + static::assertTrue(in_array('text_fr', $found)); + static::assertTrue(in_array('text_zh', $found)); + } + + /** + * Test getting all analyzers + */ + public function testGetAllAnalyzers() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'identity'); + $this->analyzerHandler->create($analyzer); + + $analyzer = new Analyzer('Analyzer2' . '_' . static::$testsTimestamp, 'text', [ "locale" => "en.UTF-8", "stopwords" => [] ]); + $this->analyzerHandler->create($analyzer); + + $result = $this->analyzerHandler->getAll(); + static::assertFalse($result['error']); + + $analyzers = $result['result']; + static::assertTrue(count($analyzers) > 0); + + $found = []; + foreach ($analyzers as $analyzer) { + $name = $analyzer['name']; + $found[] = $name; + } + + static::assertTrue(in_array('_system::Analyzer1' . '_' . static::$testsTimestamp, $found)); + static::assertTrue(in_array('_system::Analyzer2' . '_' . static::$testsTimestamp, $found)); + } + + /** + * Test getting a non-existing analyzer + */ + public function testGetNonExistingAnalyzer() + { + try { + $this->analyzerHandler->get('Analyzer1' . '_' . static::$testsTimestamp); + } catch (\Exception $exception) { + } + static::assertEquals(404, $exception->getCode()); + } + + /** + * Test analyzer properties + */ + public function testAnalyzerProperties() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'identity'); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('identity', $result['type']); + static::assertEquals([], $analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + + $result = $this->analyzerHandler->properties($analyzer); + static::assertEquals('_system::Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('identity', $result['type']); + static::assertEquals([], $analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + + $analyzer = new Analyzer('Analyzer2' . '_' . static::$testsTimestamp, 'text', [ "locale" => "en.UTF-8", "stopwords" => [] ]); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer2' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('text', $result['type']); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + + $result = $this->analyzerHandler->properties($analyzer); + static::assertEquals('_system::Analyzer2' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('text', $result['type']); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + } + + /** + * Test drop analyzer + */ + public function testDropAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'identity'); + $this->analyzerHandler->create($analyzer); + $result = $this->analyzerHandler->drop('Analyzer1' . '_' . static::$testsTimestamp); + static::assertTrue($result); + } + + /** + * Test drop non-existing analyzer + */ + public function testDropNonExistingAnalyzer() + { + try { + $this->analyzerHandler->drop('Analyzer1' . '_' . static::$testsTimestamp); + } catch (\Exception $exception) { + } + static::assertEquals(404, $exception->getCode()); + } + + public function tearDown() + { + $this->analyzerHandler = new AnalyzerHandler($this->connection); + try { + $this->analyzerHandler->drop('Analyzer1' . '_' . static::$testsTimestamp); + } catch (Exception $e) { + } + try { + $this->analyzerHandler->drop('Analyzer2' . '_' . static::$testsTimestamp); + } catch (Exception $e) { + } + } +} diff --git a/tests/ViewTest.php b/tests/ViewTest.php index 5e56d0df..55213b21 100644 --- a/tests/ViewTest.php +++ b/tests/ViewTest.php @@ -40,10 +40,10 @@ public function setUp() */ public function testCreateViewObject() { - $this->view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); - static::assertNull($this->view->getId()); - static::assertEquals('View1' . '_' . static::$testsTimestamp, $this->view->getName()); - static::assertEquals('arangosearch', $this->view->getType()); + $view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + static::assertNull($view->getId()); + static::assertEquals('View1' . '_' . static::$testsTimestamp, $view->getName()); + static::assertEquals('arangosearch', $view->getType()); } /** @@ -51,8 +51,8 @@ public function testCreateViewObject() */ public function testCreateView() { - $this->view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); - $result = $this->viewHandler->create($this->view); + $view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + $result = $this->viewHandler->create($view); static::assertEquals('View1' . '_' . static::$testsTimestamp, $result['name']); static::assertEquals('arangosearch', $result['type']); } @@ -62,10 +62,10 @@ public function testCreateView() */ public function testGetView() { - $this->view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); - $this->viewHandler->create($this->view); + $view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + $this->viewHandler->create($view); - $result = $this->viewHandler->get('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + $result = $this->viewHandler->get('View1' . '_' . static::$testsTimestamp); static::assertEquals('View1' . '_' . static::$testsTimestamp, $result->getName()); static::assertEquals('arangosearch', $result->getType()); } @@ -76,7 +76,7 @@ public function testGetView() public function testGetNonExistingView() { try { - $this->viewHandler->get('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + $this->viewHandler->get('View1' . '_' . static::$testsTimestamp); } catch (\Exception $exception) { } static::assertEquals(404, $exception->getCode()); @@ -87,12 +87,12 @@ public function testGetNonExistingView() */ public function testViewProperties() { - $this->view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); - $result = $this->viewHandler->create($this->view); + $view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + $result = $this->viewHandler->create($view); static::assertEquals('View1' . '_' . static::$testsTimestamp, $result['name']); static::assertEquals('arangosearch', $result['type']); - $result = $this->viewHandler->properties($this->view); + $result = $this->viewHandler->properties($view); static::assertEquals([], $result['links']); } @@ -102,8 +102,8 @@ public function testViewProperties() */ public function testViewSetProperties() { - $this->view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); - $result = $this->viewHandler->create($this->view); + $view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + $result = $this->viewHandler->create($view); static::assertEquals('View1' . '_' . static::$testsTimestamp, $result['name']); static::assertEquals('arangosearch', $result['type']); @@ -112,7 +112,7 @@ public function testViewSetProperties() '_graphs' => [ 'includeAllFields' => true ] ] ]; - $result = $this->viewHandler->setProperties($this->view, $properties); + $result = $this->viewHandler->setProperties($view, $properties); static::assertEquals('arangosearch', $result['type']); static::assertTrue($result['links']['_graphs']['includeAllFields']); static::assertEquals([], $result['links']['_graphs']['fields']); @@ -123,8 +123,8 @@ public function testViewSetProperties() */ public function testDropView() { - $this->view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); - $this->viewHandler->create($this->view); + $view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + $this->viewHandler->create($view); $result = $this->viewHandler->drop('View1' . '_' . static::$testsTimestamp); static::assertTrue($result); } @@ -151,8 +151,8 @@ public function testRenameView() $this->markTestSkipped("test is only meaningful in a single server"); return; } - $this->view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); - $this->viewHandler->create($this->view); + $view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + $this->viewHandler->create($view); $result = $this->viewHandler->rename('View1' . '_' . static::$testsTimestamp, 'View2' . '_' . static::$testsTimestamp); static::assertTrue($result); } @@ -167,8 +167,8 @@ public function testRenameNonExistingView() $this->markTestSkipped("test is only meaningful in a single server"); return; } - $this->view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); - $this->viewHandler->create($this->view); + $view = new View('View1' . '_' . static::$testsTimestamp, 'arangosearch'); + $this->viewHandler->create($view); try { $this->viewHandler->rename('View2' . '_' . static::$testsTimestamp, 'View1' . '_' . static::$testsTimestamp); } catch (\Exception $exception) { From b72a111e438ba15d7157ec7222b195d11887c2a6 Mon Sep 17 00:00:00 2001 From: Simran Date: Tue, 7 Jan 2020 14:06:42 +0100 Subject: [PATCH 031/101] Docs: Update links, formatting (#270) --- CHANGELOG.md | 216 ++++++++---------- README.md | 14 +- docs/Drivers/PHP/GettingStarted/README.md | 11 +- docs/Drivers/PHP/README.md | 9 +- docs/Drivers/PHP/Tutorial/README.md | 50 ++-- docs/classes/ArangoDBClient.AdminHandler.html | 4 +- .../ArangoDBClient.CollectionHandler.html | 2 +- docs/classes/ArangoDBClient.Database.html | 14 +- docs/classes/ArangoDBClient.Endpoint.html | 2 +- docs/classes/ArangoDBClient.Traversal.html | 2 +- docs/structure.xml | 24 +- lib/ArangoDBClient/AdminHandler.php | 4 +- lib/ArangoDBClient/CollectionHandler.php | 2 +- lib/ArangoDBClient/Database.php | 14 +- lib/ArangoDBClient/Endpoint.php | 2 +- lib/ArangoDBClient/Traversal.php | 2 +- 16 files changed, 164 insertions(+), 208 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85f6f2ed..168400b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ -Release notes for the ArangoDB-PHP driver 3.6.x -=============================================== +# Changelog + +## Release notes for the ArangoDB-PHP driver 3.6.x Deprecated `Collection::setMinReplicationFactor()` and `Collection::getMinReplicationFactor()` in favor of `Collection::setWriteConcern()` and `Collection::getWriteConcern()`. @@ -10,11 +11,10 @@ Added support for per-database default options (`replicationFactor`, `writeConce Added `maxRuntime` option to `Statement` class for automatically timing out queries on the server-side. -Added support for custom analyzers for arangosearch. +Added support for custom Analyzers for ArangoSearch. -Release notes for the ArangoDB-PHP driver 3.5.x -=============================================== +## Release notes for the ArangoDB-PHP driver 3.5.x Made `DocumentHandler::save()` an alias for `DocumentHandler::insert()`, to more closely match the function names used in arangosh/arangod. @@ -38,7 +38,7 @@ Other driver operations than the above are currently not supported within stream Streaming transactions are provided by a new class `StreamingTransaction` and a new handler `StreamingTransactionHandler`. - + $document = new DocumentHandler($connection); $transactionHandler = new StreamingTransactionHandler($connection); @@ -51,16 +51,16 @@ Streaming transactions are provided by a new class `StreamingTransaction` and a // starts the transaction $trx = $transactionHandler->create($trx); - + // get a StreamingTransactionCollection object. this is used to execute operations // in a transaction context $trxCollection = $trx->getCollection('testCollection'); - + // pass the StreamingTransactionCollection into the document operations instead of // a regular Collection object - this will make the operations execute in the context // of the currently running transaction $result = $documentHandler->insert($trxCollection, [ '_key' => 'test1', 'value' => 'test1' ]); - + $result = $documentHandler->insert($trxCollection, [ '_key' => 'test2', 'value' => 'test2' ]); // commits the transaction @@ -140,34 +140,33 @@ Removed unused `$_action` member in class `AqlUserFunction`, also removed its `__toString()` method. -Release notes for the ArangoDB-PHP driver 3.4.x -=============================================== +## Release notes for the ArangoDB-PHP driver 3.4.x + Starting with release 3.4.0, the following constants were removed from the `CollectionHandler` class: -* `OPTION_IGNORE_NULL` -* `OPTION_CONSTRAINT` +- `OPTION_IGNORE_NULL` +- `OPTION_CONSTRAINT` These constants were geo-index related, and the geo-index functionality changes in ArangoDB 3.4 have made these constants obsolete. For the same reason, the `createGeoIndex` function signature in the same class has changed from -``` -public function createGeoIndex($collectionId, array $fields, $geoJson = null, $constraint = null, $ignoreNull = null) -``` + + public function createGeoIndex($collectionId, array $fields, $geoJson = null, $constraint = null, $ignoreNull = null) + to just -``` -public function createGeoIndex($collectionId, array $fields, $geoJson = null) -``` + + public function createGeoIndex($collectionId, array $fields, $geoJson = null) Additionally the 3.4 release of the driver adds support for the following collection properties: -* replicationFactor: number of replicas to keep per shard in a cluster environment +- replicationFactor: number of replicas to keep per shard in a cluster environment (a replication factor of 1 will be used if this is not specified) -* shardingStrategy: sharding strategy to be used for the collection +- shardingStrategy: sharding strategy to be used for the collection The `Collection` class also got the new methods `setReplicationFactor`, `getReplicationFactor`, `setShardingStrategy` and `getShardingStrategy`. @@ -186,12 +185,11 @@ unique constraint violation error on the primary key. The method `insert` was introduced in `DocumentHandler` as an alias for the existing `save` method to be consistent with the server-side method naming. -Basic support for arangosearch views was added in 3.4.0, via the `View` and `ViewHandler` +Basic support for ArangoSearch Views was added in 3.4.0, via the `View` and `ViewHandler` classes. -Release notes for the ArangoDB-PHP driver 3.3.x -=============================================== +## Release notes for the ArangoDB-PHP driver 3.3.x Starting from release 3.3.1, the PHP driver has support for automatic failover, for ArangoDB servers that are started in the active failover mode. This setup requires @@ -200,7 +198,7 @@ using ArangoDB 3.3. In order to use automatic failover from the PHP driver, simply change the "endpoint" attribute of the connection options from a simple endpoint string into an array of endpoint strings: - + $connectionOptions = [ ConnectionOptions::OPTION_ENDPOINT => [ 'tcp://localhost:8531', 'tcp://localhost:8532', 'tcp://localhost:8530' ], ... @@ -208,7 +206,7 @@ endpoint strings: $connection = new Connection($connectionOptions); instead of just - + $connectionOptions = [ ConnectionOptions::OPTION_ENDPOINT => 'tcp://localhost:8530', ... @@ -221,7 +219,7 @@ return an array of endpoints. For the single-server case, the returned value wil an array with the specified endpoint. When active failover is used, the result will be an array with the specified endpoints or the endpoints found (added) at runtime. For example, in - + $options = [ ConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529' ]; $co = new ConnectionOptions($options); print_r($co[ConnectionOptions::OPTION_ENDPOINT]); @@ -237,14 +235,13 @@ numbers. For example, reading the `port` option here will provide just one of the specified ports, so it should be avoided: - + $options = [ ConnectionOptions::OPTION_ENDPOINT => [ 'tcp://127.0.0.1:8529', 'tcp://127.0.0.1:8530' ] ]; $co = new ConnectionOptions($options); print_r($co[ConnectionOptions::OPTION_PORT]); -Release notes for the ArangoDB-PHP driver 3.2.x -=============================================== +## Release notes for the ArangoDB-PHP driver 3.2.x - the default value for the authentication type of the `Connection` class is now `Basic` @@ -257,7 +254,7 @@ Release notes for the ArangoDB-PHP driver 3.2.x __Important incompatible changes related to this:__ - Document::getId(): Will return the correct id (CollectionName/DocumentID) instead of the key (DocumentID). - UrlHelper::getDocumentIdFromLocation(): Will now return a "real" _id instead of what was essentially the `_key` - + __Other changes related to this:__ - DocumentHandler::getById(): Will work as before, but it will also accept a "real" document ID in addition to the key. If a real document ID is given, the collection data will be extracted from that string. That means that the first parameter `$collection` does not need to have a valid value, in that case. @@ -276,27 +273,21 @@ still use the class names from the `\triagens\ArangoDb` namespace - `UserHandler::revokeCollectionPermissions` -Release notes for the ArangoDB-PHP driver 3.1.0 -=============================================== +## Release notes for the ArangoDB-PHP driver 3.1.0 This version of the driver is compatible with ArangoDB 3.1.x It is not compatible to earlier versions of ArangoDB (i.e. 2.x). Please use one of the `2.x` branches of the driver for 2.x-compatibility. - - -Caution!!! -========== +**Caution!** - Up until the 3.0.x versions of this driver, there were still deprecated methods and parameter compatibility functions in the code, which unfortunately were not removed according to their deprecation annotations. That deprecated code was now finally removed with this version (3.1.0) of the driver, in order to clean up the codebase. - With this version of the driver, the method signature that used to accept $options either as an array or a non-array type has been removed. The specific compatibility layer was deprecated a long time ago and did not provide any benefits apart from compatibility. Starting with this version of the driver, there is now only one method signature that will require $options to be an array. - -**Please check and change your code accordingly!** +Please check and change your code accordingly! -Changes -======= +### Changes - Removed old deprecated methods: - AdminHandler::flushServerModuleCache() @@ -315,12 +306,12 @@ Changes - Graph::setEdgesCollection() - Graph::getEdgesCollection() - Handler::getCursorOptions() - + - Removed the old-style compatibility layer for parameter-passing in various methods that was used prior to switching to the $options parameter. This means, that wherever an $option array is passed to methods and a non-array type was also allowed (bool, string) for $options, the $options parameter **must** now be an array - it will not accept bool values or string values anymore, like for example a policy definition. - + - Performance might be a bit better due to the removal of the compatibility layer for $options. - + - Cleaned up and enriched annotations - Applied various smaller bug fixes @@ -328,48 +319,34 @@ Changes - GraphHandler: Optimized code to do less work when not necessary - GraphHandler: Implemented optional cache that caches the Vertex/Edge-Collections instead of making expensive calls to the DB. - GraphHandler: Is now batch-able. However, if any collections need to be fetched, they will be done out-of-batch. - If a lot of calls to the GraphHandler are being made, the use of the new caching functionality is encouraged. + If a lot of calls to the GraphHandler are being made, the use of the new caching functionality is encouraged. - Batches: Some work has been done, to optimize batches. This is still in development. - Switched from phpDocumentor to apigen - New Docs were generated - - - -============================================================================================================ - - -Release notes for the ArangoDB-PHP driver 3.0.8 -=============================================== +## Release notes for the ArangoDB-PHP driver 3.0.8 This version of the driver is compatible with ArangoDB 3.0.x It is not compatible to earlier versions of ArangoDB (i.e. 2.x). Please use ones of the `2.x` branches of the driver for 2.x-compatibility. -Bug fixes -========= +### Bug fixes Fixed bug related to creating the correct collection type. This was no problem for the default, which is 'document', but it was a problem when the option 'createCollection'=>true was passed with save_edge(). -============================================================================================================ - - -Release notes for the ArangoDB-PHP driver 3.0.7 -=============================================== +## Release notes for the ArangoDB-PHP driver 3.0.7 This version of the driver is compatible with ArangoDB 3.0.7 It is not compatible to earlier versions of ArangoDB (i.e. 2.x). Please use ones of the `2.x` branches of the driver for 2.x-compatibility. -Changed functionality -===================== +### Changed functionality -Batch processing ----------------- +**Batch processing** Added an option to pre-define a batch size for a batch. This results in the driver using an SplFixedArray for the storage of the batch parts, @@ -380,30 +357,61 @@ The option is called batchSize and accepts an integer. Example: $batch = new Batch($this->connection, ['batchSize' => 10000]); - -Bug fixes -========= +### Bug fixes Do to the many API changes in version 3 of ArangoDB, the driver had to go through a lot of changes too. This resulted in some inconsistencies in its functionality. Version 3.0.7 has hopefully dealt with them all. If there should be any more left, please create an issue to report it. -============================================================================================================ - - -Release notes for the ArangoDB-PHP driver 3.0 -============================================= +## Release notes for the ArangoDB-PHP driver 3.0 This version of the driver is compatible with ArangoDB 3.0. It is not compatible to earlier versions of ArangoDB (i.e. 2.x). Please use ones of the `2.x` branches of the driver for 2.x-compatibility. -Changed functionality -===================== +### Changed functionality + +**Graph Management** + +When replacing edges via the `EdgeHandler::replace()` method, it is now +required to specify both the `_from` and `_to` values of the replacing edge. +If either attribute is missing or invalid, the replace operation will fail +with an error `invalid edge attribute` on the server-side. + +That means the following may not work: + +```php +$edgeHandler = new EdgeHandler($connection); + +$edge = new Edge(); +$edge->set("_id", $idOfExistingEdge); +/* set some other edge attributes */ +... + +$result = $edgeHandler->replace($edge); +``` + +until at least `_from` and `_to` are also set via the `setFrom()` and `setTo()` +methods: + +```php +$edgeHandler = new EdgeHandler($connection); + +$edge = new Edge(); +$edge->set("_id", $idOfExistingEdge); +/* set some other edge attributes */ +... +$edge->setFrom($fromHandle); +$edge->setTo($toHandle); + +$result = $edgeHandler->replace($edge); +``` + +Note that this affects only the `replace()` and `replaceById()` methods and +not `update()` nor `updateById()`. -User management ---------------- +**User management** The user management APIs in class `UserHandler` have changed slightly. The methods for adding, replacing and updating users had an optional parameter named `$options`, which did nothing. @@ -427,12 +435,9 @@ User permissions can be adjusted manually by using the following new methods of - UserHandler::grantPermissions($username, $databaseName) - UserHandler::revokePermissions($username, $databaseName) +### Unsupported functionality -Unsupported functionality -========================= - -Cap constraints ---------------- +**Cap constraints** Support for cap constraints has been discontinued on the 3.0 version of ArangoDB. Therefore, the following methods have also been removed from the PHP driver in @@ -442,8 +447,7 @@ the 3.0 branch: - CollectionHandler::first($collectionId, $count = null) - CollectionHandler::last($collectionId, $count = null) -Graph functions ---------------- +**Graph functions** The ArangoDB PHP driver provided PHP wrapper methods for common graph functions that were implemented server-side. When one of these wrapper methods was called, @@ -482,8 +486,7 @@ not limited to the subset of the functionality that was available in the "old" graph functions' interfaces, but can use the full functionality and composability of AQL. -Custom queues -------------- +**Custom queues** "Custom queues" were an undocumented, experimental feature in later versions of the 2.x driver. Its purpose was to send requests to dedicated processing @@ -498,8 +501,7 @@ PHP driver: - Connection::enableCustomQueue($queueName, $count = null) - Connection::disableCustomQueue() -Client versioning ------------------ +**Client versioning** The client-side versioning feature was also removed from the driver in version 3.0. The versioning feature allowed sending the HTTP header `X-Arango-Version` @@ -513,43 +515,3 @@ been removed from the driver's `Connection` class. - Connection::getVersion() - Connection::getClientVersion() - -Changed functionality -===================== - -When replacing edges via the `EdgeHandler::replace()` method, it is now -required to specify both the `_from` and `_to` values of the replacing edge. -If either attribute is missing or invalid, the replace operation will fail -with an error `invalid edge attribute` on the server-side. - -That means the following may not work: - -```php -$edgeHandler = new EdgeHandler($connection); - -$edge = new Edge(); -$edge->set("_id", $idOfExistingEdge); -/* set some other edge attributes */ -... - -$result = $edgeHandler->replace($edge); -``` - -until at least `_from` and `_to` are also set via the `setFrom()` and `setTo()` -methods: - -```php -$edgeHandler = new EdgeHandler($connection); - -$edge = new Edge(); -$edge->set("_id", $idOfExistingEdge); -/* set some other edge attributes */ -... -$edge->setFrom($fromHandle); -$edge->setTo($toHandle); - -$result = $edgeHandler->replace($edge); -``` - -Note that this affects only the `replace()` and `replaceById()` methods and -not `update()` nor `updateById()`. diff --git a/README.md b/README.md index 1b86fa36..67ef2177 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ -![ArangoDB-Logo](https://docs.arangodb.com/assets/arangodb_logo_2016_inverted.png) +![ArangoDB-Logo](https://www.arangodb.com/docs/assets/arangodb_logo_2016_inverted.png) # ArangoDB-PHP - A PHP client for ArangoDB + The official ArangoDB PHP Driver. 3.2: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.2)](https://travis-ci.org/arangodb/arangodb-php) @@ -14,8 +15,13 @@ devel: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=d # More information -* More example code, containing some code to create, delete and rename collections, is provided in the [examples](examples) subdirectory that is provided with the library. +- More example code, containing some code to create, delete and rename + collections, is provided in the [examples](examples) subdirectory that is + provided with the library. -* [PHPDoc documentation](http://arangodb.github.io/arangodb-php/) for the complete library +- [PHPDoc documentation](http://arangodb.github.io/arangodb-php/) + for the complete library -* [Follow us on Twitter](https://twitter.com/arangodbphp) [@arangodbphp](https://twitter.com/arangodbphp) to receive updates on the PHP driver +- [Follow us on Twitter](https://twitter.com/arangodbphp) + [@arangodbphp](https://twitter.com/arangodbphp) + to receive updates on the PHP driver diff --git a/docs/Drivers/PHP/GettingStarted/README.md b/docs/Drivers/PHP/GettingStarted/README.md index 0a8c9c1d..81798fa8 100644 --- a/docs/Drivers/PHP/GettingStarted/README.md +++ b/docs/Drivers/PHP/GettingStarted/README.md @@ -1,4 +1,5 @@ # ArangoDB-PHP - Getting Started + ## Description This PHP client allows REST-based access to documents on the server. @@ -13,11 +14,11 @@ The autoloader will care about loading additionally required classes on the fly. The ArangoDB PHP client is an API that allows you to send and retrieve documents from ArangoDB from out of your PHP application. The client library itself is written in PHP and has no further dependencies but just plain PHP 5.6 (or higher). -The client library provides document and collection classes you can use to work with documents and collections in an OO fashion. When exchanging document data with the server, the library internally will use the [HTTP REST interface of ArangoDB](../../../HTTP/index.html). The library user does not have to care about this fact as all the details of the REST interface are abstracted by the client library. +The client library provides document and collection classes you can use to work with documents and collections in an OO fashion. When exchanging document data with the server, the library internally will use the [HTTP REST interface of ArangoDB](https://www.arangodb.com/docs/stable/http/index.html). The library user does not have to care about this fact as all the details of the REST interface are abstracted by the client library. ## Requirements -* PHP version 5.6 or higher (Travis-tested with PHP 5.6, 7.0, 7.1 and hhvm) +- PHP version 5.6 or higher (Travis-tested with PHP 5.6, 7.0, 7.1 and hhvm) Note on PHP version support: @@ -33,8 +34,7 @@ The ArangoDB-PHP driver version has to match with the ArangoDB version: - ArangoDB-PHP 3.2.x is on par with the functionality of ArangoDB 3.2.x - ArangoDB-PHP 3.3.x is on par with the functionality of ArangoDB 3.3.x -etc... - +etc. ### Installing the PHP client @@ -50,13 +50,13 @@ There are two alternative ways to get the ArangoDB PHP client: ``` composer require triagens/arangodb ``` + #### Alternative 2: Cloning the git repository When preferring this alternative, you need to have a git client installed. To clone the ArangoDB PHP client repository from github, execute the following command in your project directory: git clone "https://github.com/arangodb/arangodb-php.git" - This will create a subdirectory arangodb-php in your current directory. It contains all the files of the client library. It also includes a dedicated autoloader that you can use for autoloading the client libraries class files. To invoke this autoloader, add the following line to your PHP files that will use the library: @@ -64,7 +64,6 @@ To invoke this autoloader, add the following line to your PHP files that will us require 'arangodb-php/autoload.php'; ``` - The ArangoDB PHP client's autoloader will only care about its own class files and will not handle any other files. That means it is fully nestable with other autoloaders. #### Alternative 3: Invoking the autoloader directly diff --git a/docs/Drivers/PHP/README.md b/docs/Drivers/PHP/README.md index 0873fab2..6fb8930b 100644 --- a/docs/Drivers/PHP/README.md +++ b/docs/Drivers/PHP/README.md @@ -1,4 +1,5 @@ # ArangoDB-PHP - A PHP client for ArangoDB + The official ArangoDB PHP Driver. - [Getting Started](GettingStarted/README.md) @@ -7,11 +8,11 @@ The official ArangoDB PHP Driver. # More information -* Check the ArangoDB PHP client on github.com regularly for new releases and updates: [https://github.com/arangodb/arangodb-php](https://github.com/arangodb/arangodb-php) +- Check the ArangoDB PHP client on github.com regularly for new releases and updates: [https://github.com/arangodb/arangodb-php](https://github.com/arangodb/arangodb-php) -* More example code, containing some code to create, delete and rename collections, is provided in the [examples](https://github.com/arangodb/arangodb-php/tree/devel/examples) subdirectory that is provided with the library. +- More example code, containing some code to create, delete and rename collections, is provided in the [examples](https://github.com/arangodb/arangodb-php/tree/devel/examples) subdirectory that is provided with the library. -* [PHPDoc documentation](http://arangodb.github.io/arangodb-php/) for the complete library +- [PHPDoc documentation](http://arangodb.github.io/arangodb-php/) for the complete library -* [Follow us on Twitter](https://twitter.com/arangodbphp) +- [Follow us on Twitter](https://twitter.com/arangodbphp) [@arangodbphp](https://twitter.com/arangodbphp) to receive updates on the PHP driver diff --git a/docs/Drivers/PHP/Tutorial/README.md b/docs/Drivers/PHP/Tutorial/README.md index b0aae139..2c70db74 100644 --- a/docs/Drivers/PHP/Tutorial/README.md +++ b/docs/Drivers/PHP/Tutorial/README.md @@ -1,4 +1,5 @@ # ArangoDB-PHP - Tutorial + ## Setting up the connection options In order to use ArangoDB, you need to specify the connection options. We do so by creating a PHP array $connectionOptions. Put this code into a file named test.php in your current directory: @@ -60,20 +61,19 @@ ArangoException::enableLogging(); This will make the client connect to ArangoDB -* running on localhost (OPTION_HOST) -* on the default port 8529 (OPTION_PORT) -* with a connection timeout of 3 seconds (OPTION_TIMEOUT) +- running on localhost (OPTION_HOST) +- on the default port 8529 (OPTION_PORT) +- with a connection timeout of 3 seconds (OPTION_TIMEOUT) When creating new documents in a collection that does not yet exist, you have the following choices: -* auto-generate a new collection: if you prefer that, set OPTION_CREATE to true -* fail with an error: if you prefer this behavior, set OPTION_CREATE to false +- auto-generate a new collection: if you prefer that, set OPTION_CREATE to true +- fail with an error: if you prefer this behavior, set OPTION_CREATE to false When updating a document that was previously/concurrently updated by another user, you can select between the following behaviors: -* last update wins: if you prefer this, set OPTION_UPDATE_POLICY to last -* fail with a conflict error: if you prefer that, set OPTION_UPDATE_POLICY to conflict - +- last update wins: if you prefer this, set OPTION_UPDATE_POLICY to last +- fail with a conflict error: if you prefer that, set OPTION_UPDATE_POLICY to conflict ## Setting up active failover @@ -95,6 +95,7 @@ $connectionOptions = [ ConnectionOptions::OPTION_ENDPOINT => [ 'tcp://localhost:8531', 'tcp://localhost:8532', 'tcp://localhost:8530' ] ]; ``` + Using this option requires ArangoDB 3.3 or higher and the database running in active failover mode. @@ -132,8 +133,8 @@ $connectionOptions = [ ]; ``` - ## Creating a collection + *This is just to show how a collection is created.* *For these examples it is not needed to create a collection prior to inserting a document, as we set ArangoConnectionOptions::OPTION_CREATE to true.* @@ -162,8 +163,8 @@ The below code will first set up the collection locally in a variable name $user // check if the collection exists $result = $collectionHandler->has('users'); var_dump($result); +``` - ``` ## Creating a document After we created the collection, we can start with creating an initial document. We will create a user document in a collection named "users". This collection does not need to exist yet. The first document we'll insert in this collection will create the collection on the fly. This is because we have set OPTION_CREATE to true in $connectionOptions. @@ -202,30 +203,29 @@ As you can see, sending a document to the server is achieved by calling the save ## Adding exception handling - The above code will work but it does not check for any errors. To make it work in the face of errors, we'll wrap it into some basic exception handlers ```php try { $handler = new ArangoDocumentHandler($connection); - + // create a new document $user = new ArangoDocument(); - + // use set method to set document properties $user->set('name', 'John'); $user->set('age', 25); - + // use magic methods to set document properties $user->likes = ['fishing', 'hiking', 'swimming']; - + // send the document to the server $id = $handler->save('users', $user); - + // check if a document exists $result = $handler->has('users', $id); var_dump($result); - + // print the document id created by the server var_dump($id); var_dump($user->getId()); @@ -291,7 +291,6 @@ Note that CollectionHandler->byExample() might return multiple documents if the ## Updating a document - To update an existing document, the update() method of the *DocumentHandler* class can be used. In this example we want to - set state to 'ca' @@ -389,12 +388,10 @@ Note that the document must have been fetched from the server before. If you hav } ``` - ## Running an AQL query - To run an AQL query, use the *Statement* class. - + The method Statement::execute creates a Cursor object which can be used to iterate over the query's result set. @@ -440,7 +437,6 @@ that cannot be converted into Document objects. In order to suppress the conversion into Document objects, the Statement must be given the `_flat` attribute. This allows processing the results of arbitrary AQL queries: - ```php // run an AQL query that does not return documents but scalars // we need to set the _flat attribute of the Statement in order for this to work @@ -460,17 +456,14 @@ the `_flat` attribute. This allows processing the results of arbitrary AQL queri ``` - ## Exporting data - To export the contents of a collection to PHP, use the *Export* class. The *Export* class will create a light-weight cursor over all documents of the specified collection. The results can be transferred to PHP in chunks incrementally. This is the most efficient way of iterating over all documents in a collection. - ```php // creates an export object for collection users $export = new ArangoExport($connection, 'users', []); @@ -504,12 +497,10 @@ over all documents in a collection. ## Bulk document handling - The ArangoDB-PHP driver provides a mechanism to easily fetch multiple documents from the same collection with a single request. All that needs to be provided is an array of document keys: - ```php $exampleCollection = new ArangoCollection(); $exampleCollection->setName('example'); @@ -536,11 +527,9 @@ of document keys: $result = $collectionHandler->removeByKeys('example', $keys); var_dump($result); - - ``` -## Dropping a collection +## Dropping a collection To drop an existing collection on the server, use the drop() method of the *CollectionHandler* class. drop() just needs the name of the collection name to be dropped: @@ -576,7 +565,6 @@ See file examples/customDocumentClass.php for more details. ## Logging exceptions - The driver provides a simple logging mechanism that is turned off by default. If it is turned on, the driver will log all its exceptions using PHP's standard `error_log` mechanism. It will call PHP's `error_log()` function for this. It depends on the PHP configuration if and where exceptions will be logged. Please consult diff --git a/docs/classes/ArangoDBClient.AdminHandler.html b/docs/classes/ArangoDBClient.AdminHandler.html index 9615fe59..e4535a3a 100644 --- a/docs/classes/ArangoDBClient.AdminHandler.html +++ b/docs/classes/ArangoDBClient.AdminHandler.html @@ -252,7 +252,7 @@

    Get the server statistics - + @@ -283,7 +283,7 @@

    Returns a description of the statistics returned by getServerStatistics().

    - + diff --git a/docs/classes/ArangoDBClient.CollectionHandler.html b/docs/classes/ArangoDBClient.CollectionHandler.html index ceb8ce23..85d410e1 100644 --- a/docs/classes/ArangoDBClient.CollectionHandler.html +++ b/docs/classes/ArangoDBClient.CollectionHandler.html @@ -1220,7 +1220,7 @@

    Import documents into a collection

    This will throw on all errors except insertion errors

    linkThis will throw if the statistics cannot be retrievedThis will throw if the statistics cannot be retrieved
    see
    linkThis will throw if the statistics-description cannot be retrievedThis will throw if the statistics-description cannot be retrieved
    see
    - +
    see

    Parameters

    diff --git a/docs/classes/ArangoDBClient.Database.html b/docs/classes/ArangoDBClient.Database.html index 4ff338f7..c5ba219d 100644 --- a/docs/classes/ArangoDBClient.Database.html +++ b/docs/classes/ArangoDBClient.Database.html @@ -95,7 +95,7 @@ - + @@ -116,7 +116,7 @@

    creates a database

    This creates a new database

    linkhttps://docs.arangodb.com/HTTP/Database/index.htmlhttps://www.arangodb.com/docs/stable/http/database.html
    package
    - +
    linkhttps://docs.arangodb.com/HTTP/Database/index.htmlhttps://www.arangodb.com/docs/stable/http/database.html

    Parameters

    @@ -153,7 +153,7 @@

    List databases

    This will list the databases that exist on the server

    - +
    linkhttps://docs.arangodb.com/HTTP/Database/index.htmlhttps://www.arangodb.com/docs/stable/http/database.html

    Parameters

    @@ -185,7 +185,7 @@

    Deletes a database

    This will delete an existing database.

    - +
    linkhttps://docs.arangodb.com/HTTP/Database/index.htmlhttps://www.arangodb.com/docs/stable/http/database.html

    Parameters

    @@ -222,7 +222,7 @@

    Retrieves information about the current database

    This will get information about the currently used database from the server

    - +
    linkhttps://docs.arangodb.com/HTTP/Database/index.htmlhttps://www.arangodb.com/docs/stable/http/database.html

    Parameters

    @@ -254,7 +254,7 @@

    List databases

    This will list the databases that exist on the server

    - +
    linkhttps://docs.arangodb.com/HTTP/Database/index.htmlhttps://www.arangodb.com/docs/stable/http/database.html

    Parameters

    @@ -287,7 +287,7 @@

    List user databases

    specifying a different username or password.

    - +
    linkhttps://docs.arangodb.com/HTTP/Database/index.htmlhttps://www.arangodb.com/docs/stable/http/database.html

    Parameters

    diff --git a/docs/classes/ArangoDBClient.Endpoint.html b/docs/classes/ArangoDBClient.Endpoint.html index bc9c5fe1..6257d741 100644 --- a/docs/classes/ArangoDBClient.Endpoint.html +++ b/docs/classes/ArangoDBClient.Endpoint.html @@ -218,7 +218,7 @@

    List endpoints

    This will list the endpoints that are configured on the server

    - +
    linkhttps://docs.arangodb.com/HTTP/Endpoints/index.htmlhttps://www.arangodb.com/docs/stable/http/endpoints.html

    Parameters

    diff --git a/docs/classes/ArangoDBClient.Traversal.html b/docs/classes/ArangoDBClient.Traversal.html index c025acd3..88ca24de 100644 --- a/docs/classes/ArangoDBClient.Traversal.html +++ b/docs/classes/ArangoDBClient.Traversal.html @@ -121,7 +121,7 @@ - + diff --git a/docs/structure.xml b/docs/structure.xml index c80a6b91..b7a9b177 100644 --- a/docs/structure.xml +++ b/docs/structure.xml @@ -2810,7 +2810,7 @@ Note: SSL support is added in ArangoDB server 1.1<br> \ArangoDBClient\Connection - + array @@ -5759,7 +5759,7 @@ declaring all attributes first. The object requires the connection object, the startVertex, the edgeCollection and the optional parameters.<br> <br> - + @@ -8303,7 +8303,7 @@ changed since the last revision check. array - + array @@ -9684,7 +9684,7 @@ This is only for options that are to be sent to the ArangoDB server in a json bo A class for managing ArangoDB Databases This class provides functions to manage Databases through ArangoDB's Database API<br> - + @@ -9718,7 +9718,7 @@ This is only for options that are to be sent to the ArangoDB server in a json bo string - + array @@ -9752,7 +9752,7 @@ This is only for options that are to be sent to the ArangoDB server in a json bo string - + array @@ -9783,7 +9783,7 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\Connection - + array @@ -9809,7 +9809,7 @@ This is only for options that are to be sent to the ArangoDB server in a json bo \ArangoDBClient\Connection - + array @@ -9836,7 +9836,7 @@ specifying a different username or password. \ArangoDBClient\Connection - + array @@ -9862,7 +9862,7 @@ specifying a different username or password. \ArangoDBClient\Connection - + array @@ -26424,7 +26424,7 @@ describing the group stored in system and in that sub-object the value for userT attribute of the same name.In case of a distribution, the returned object contains the total count in count and the distribution list in counts. For more information on the statistics returned, please lookup the statistics interface description at - + \ArangoDBClient\Exception @@ -26443,7 +26443,7 @@ For more information on the statistics returned, please lookup the statistics in The returned objects contains a list of statistics groups in the attribute groups and a list of statistics figures in the attribute figures. For more information on the statistics returned, please lookup the statistics interface description at - + \ArangoDBClient\Exception diff --git a/lib/ArangoDBClient/AdminHandler.php b/lib/ArangoDBClient/AdminHandler.php index 287b8f9a..c80ef3a3 100644 --- a/lib/ArangoDBClient/AdminHandler.php +++ b/lib/ArangoDBClient/AdminHandler.php @@ -180,7 +180,7 @@ public function reloadServerRouting() * and the distribution list in counts. * For more information on the statistics returned, please lookup the statistics interface description at * - * @link https://docs.arangodb.com/HTTP/AdministrationAndMonitoring/index.html + * @link https://www.arangodb.com/docs/stable/http/administration-and-monitoring.html * * This will throw if the statistics cannot be retrieved * @@ -207,7 +207,7 @@ public function getServerStatistics() * and a list of statistics figures in the attribute figures. * For more information on the statistics returned, please lookup the statistics interface description at * - * @link https://docs.arangodb.com/HTTP/AdministrationAndMonitoring/index.html + * @link https://www.arangodb.com/docs/stable/http/administration-and-monitoring.html * * This will throw if the statistics-description cannot be retrieved * diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index 3a05be9e..0794a70d 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -811,7 +811,7 @@ public function importFromFile($collection, $importFileName, array $options = [] * * Other options as described in API Documentation* * - * @see https://docs.arangodb.com/3.1/HTTP/BulkImports/ + * @see https://www.arangodb.com/docs/stable/http/bulk-imports.html * * @return array * @throws \ArangoDBClient\Exception diff --git a/lib/ArangoDBClient/Database.php b/lib/ArangoDBClient/Database.php index 6a151494..b1db5050 100644 --- a/lib/ArangoDBClient/Database.php +++ b/lib/ArangoDBClient/Database.php @@ -15,7 +15,7 @@ * * This class provides functions to manage Databases through ArangoDB's Database API
    * - * @link https://docs.arangodb.com/HTTP/Database/index.html + * @link https://www.arangodb.com/docs/stable/http/database.html * * @package ArangoDBClient * @since 1.4 @@ -50,7 +50,7 @@ class Database *
  • 'writeConcern'
  • *
  • 'sharding'
  • * - * @link https://docs.arangodb.com/HTTP/Database/index.html + * @link https://www.arangodb.com/docs/stable/http/database.html * * @return array $responseArray - The response array. * @throws \ArangoDBClient\Exception @@ -86,7 +86,7 @@ public static function create(Connection $connection, $name, array $options = [] * @param Connection $connection - the connection to be used * @param string $name - the database specification, for example 'myDatabase' * - * @link https://docs.arangodb.com/HTTP/Database/index.html + * @link https://www.arangodb.com/docs/stable/http/database.html * * @return array $responseArray - The response array. * @throws \ArangoDBClient\Exception @@ -109,7 +109,7 @@ public static function delete(Connection $connection, $name) * * @param Connection $connection - the connection to be used * - * @link https://docs.arangodb.com/HTTP/Database/index.html + * @link https://www.arangodb.com/docs/stable/http/database.html * * @return array $responseArray - The response array. * @throws \ArangoDBClient\Exception @@ -127,7 +127,7 @@ public static function listDatabases(Connection $connection) * * @param Connection $connection - the connection to be used * - * @link https://docs.arangodb.com/HTTP/Database/index.html + * @link https://www.arangodb.com/docs/stable/http/database.html * * @return array $responseArray - The response array. * @throws \ArangoDBClient\Exception @@ -148,7 +148,7 @@ public static function databases(Connection $connection) * * @param Connection $connection - the connection to be used * - * @link https://docs.arangodb.com/HTTP/Database/index.html + * @link https://www.arangodb.com/docs/stable/http/database.html * * @return array $responseArray - The response array. * @throws \ArangoDBClient\Exception @@ -171,7 +171,7 @@ public static function listUserDatabases(Connection $connection) * * @param Connection $connection - the connection to be used * - * @link https://docs.arangodb.com/HTTP/Database/index.html + * @link https://www.arangodb.com/docs/stable/http/database.html * * @return array $responseArray - The response array. * @throws \ArangoDBClient\Exception diff --git a/lib/ArangoDBClient/Endpoint.php b/lib/ArangoDBClient/Endpoint.php index 5c015539..c8c8ac05 100644 --- a/lib/ArangoDBClient/Endpoint.php +++ b/lib/ArangoDBClient/Endpoint.php @@ -202,7 +202,7 @@ public static function isValid($value) * * @param Connection $connection - the connection to be used * - * @link https://docs.arangodb.com/HTTP/Endpoints/index.html + * @link https://www.arangodb.com/docs/stable/http/endpoints.html * @return array $responseArray - The response array. * @throws \ArangoDBClient\Exception */ diff --git a/lib/ArangoDBClient/Traversal.php b/lib/ArangoDBClient/Traversal.php index 4cc2845a..545af584 100644 --- a/lib/ArangoDBClient/Traversal.php +++ b/lib/ArangoDBClient/Traversal.php @@ -18,7 +18,7 @@ * The object requires the connection object, the startVertex, the edgeCollection and the optional parameters.
    *
    * - * @link https://docs.arangodb.com/HTTP/Traversal/index.html + * @link https://www.arangodb.com/docs/stable/http/traversal.html * * @package ArangoDBClient * @since 1.4 From 76b85bdd2faf7c12f1a147f097a09290dc146400 Mon Sep 17 00:00:00 2001 From: Simran Date: Tue, 7 Jan 2020 14:09:45 +0100 Subject: [PATCH 032/101] Remove docs, now at https://github.com/arangodb/docs (#272) --- README.md | 4 +- docs/Drivers/PHP/GettingStarted/README.md | 76 -- docs/Drivers/PHP/README.md | 18 - docs/Drivers/PHP/Tutorial/README.md | 876 ---------------------- 4 files changed, 2 insertions(+), 972 deletions(-) delete mode 100644 docs/Drivers/PHP/GettingStarted/README.md delete mode 100644 docs/Drivers/PHP/README.md delete mode 100644 docs/Drivers/PHP/Tutorial/README.md diff --git a/README.md b/README.md index 67ef2177..a9a7cf09 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ The official ArangoDB PHP Driver. 3.5: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.5)](https://travis-ci.org/arangodb/arangodb-php) devel: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=devel)](https://travis-ci.org/arangodb/arangodb-php) -- [Getting Started](docs/Drivers/PHP/GettingStarted/README.md) -- [Tutorial](docs/Drivers/PHP/Tutorial/README.md) +- [Getting Started](https://www.arangodb.com/docs/stable/drivers/php-getting-started.html) +- [Tutorial](https://www.arangodb.com/docs/stable/drivers/php-tutorial.html) # More information diff --git a/docs/Drivers/PHP/GettingStarted/README.md b/docs/Drivers/PHP/GettingStarted/README.md deleted file mode 100644 index 81798fa8..00000000 --- a/docs/Drivers/PHP/GettingStarted/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# ArangoDB-PHP - Getting Started - -## Description - -This PHP client allows REST-based access to documents on the server. -The *DocumentHandler* class should be used for these purposes. -There is an example for REST-based documents access in the file examples/document.php. - -Furthermore, the PHP client also allows to issue more AQL complex queries using the *Statement* class. -There is an example for this kind of statements in the file examples/select.php. - -To use the PHP client, you must include the file autoloader.php from the main directory. -The autoloader will care about loading additionally required classes on the fly. The autoloader can be nested with other autoloaders. - -The ArangoDB PHP client is an API that allows you to send and retrieve documents from ArangoDB from out of your PHP application. The client library itself is written in PHP and has no further dependencies but just plain PHP 5.6 (or higher). - -The client library provides document and collection classes you can use to work with documents and collections in an OO fashion. When exchanging document data with the server, the library internally will use the [HTTP REST interface of ArangoDB](https://www.arangodb.com/docs/stable/http/index.html). The library user does not have to care about this fact as all the details of the REST interface are abstracted by the client library. - -## Requirements - -- PHP version 5.6 or higher (Travis-tested with PHP 5.6, 7.0, 7.1 and hhvm) - -Note on PHP version support: - -This driver will cease to support old PHP versions as soon as they have reached end-of-life status. Support will be removed with the next minor or patch version of the driver to be released. - -In general, it is recommended to always use the latest PHP versions (currently those in the PHP 7 line) in order to take advantage of all the improvements (especially in performance). - -### Important version information on ArangoDB-PHP - -The ArangoDB-PHP driver version has to match with the ArangoDB version: - -- ArangoDB-PHP 3.1.x is on par with the functionality of ArangoDB 3.1.x -- ArangoDB-PHP 3.2.x is on par with the functionality of ArangoDB 3.2.x -- ArangoDB-PHP 3.3.x is on par with the functionality of ArangoDB 3.3.x - -etc. - -### Installing the PHP client - -To get started you need PHP 5.6 or higher plus an ArangoDB server running on any host that you can access. - -There are two alternative ways to get the ArangoDB PHP client: - - * Using Composer - * Cloning the git repository - -#### Alternative 1: Using Composer - -``` -composer require triagens/arangodb -``` - -#### Alternative 2: Cloning the git repository - -When preferring this alternative, you need to have a git client installed. To clone the ArangoDB PHP client repository from github, execute the following command in your project directory: - - git clone "https://github.com/arangodb/arangodb-php.git" - -This will create a subdirectory arangodb-php in your current directory. It contains all the files of the client library. It also includes a dedicated autoloader that you can use for autoloading the client libraries class files. -To invoke this autoloader, add the following line to your PHP files that will use the library: - -```php -require 'arangodb-php/autoload.php'; -``` - -The ArangoDB PHP client's autoloader will only care about its own class files and will not handle any other files. That means it is fully nestable with other autoloaders. - -#### Alternative 3: Invoking the autoloader directly - -If you do not wish to include autoload.php to load and setup the autoloader, you can invoke the autoloader directly: - -```php -require 'arangodb-php/lib/ArangoDBClient/autoloader.php'; -\ArangoDBClient\Autoloader::init(); -``` diff --git a/docs/Drivers/PHP/README.md b/docs/Drivers/PHP/README.md deleted file mode 100644 index 6fb8930b..00000000 --- a/docs/Drivers/PHP/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# ArangoDB-PHP - A PHP client for ArangoDB - -The official ArangoDB PHP Driver. - -- [Getting Started](GettingStarted/README.md) -- [Tutorial](Tutorial/README.md) -- [Changelog](https://github.com/arangodb/arangodb-php/blob/devel/CHANGELOG.md#readme) - -# More information - -- Check the ArangoDB PHP client on github.com regularly for new releases and updates: [https://github.com/arangodb/arangodb-php](https://github.com/arangodb/arangodb-php) - -- More example code, containing some code to create, delete and rename collections, is provided in the [examples](https://github.com/arangodb/arangodb-php/tree/devel/examples) subdirectory that is provided with the library. - -- [PHPDoc documentation](http://arangodb.github.io/arangodb-php/) for the complete library - -- [Follow us on Twitter](https://twitter.com/arangodbphp) - [@arangodbphp](https://twitter.com/arangodbphp) to receive updates on the PHP driver diff --git a/docs/Drivers/PHP/Tutorial/README.md b/docs/Drivers/PHP/Tutorial/README.md deleted file mode 100644 index 2c70db74..00000000 --- a/docs/Drivers/PHP/Tutorial/README.md +++ /dev/null @@ -1,876 +0,0 @@ -# ArangoDB-PHP - Tutorial - -## Setting up the connection options - -In order to use ArangoDB, you need to specify the connection options. We do so by creating a PHP array $connectionOptions. Put this code into a file named test.php in your current directory: - -```php -// use the following line when using Composer -// require __DIR__ . '/vendor/composer/autoload.php'; - -// use the following line when using git -require __DIR__ . '/arangodb-php/autoload.php'; - -// set up some aliases for less typing later -use ArangoDBClient\Collection as ArangoCollection; -use ArangoDBClient\CollectionHandler as ArangoCollectionHandler; -use ArangoDBClient\Connection as ArangoConnection; -use ArangoDBClient\ConnectionOptions as ArangoConnectionOptions; -use ArangoDBClient\DocumentHandler as ArangoDocumentHandler; -use ArangoDBClient\Document as ArangoDocument; -use ArangoDBClient\Exception as ArangoException; -use ArangoDBClient\Export as ArangoExport; -use ArangoDBClient\ConnectException as ArangoConnectException; -use ArangoDBClient\ClientException as ArangoClientException; -use ArangoDBClient\ServerException as ArangoServerException; -use ArangoDBClient\Statement as ArangoStatement; -use ArangoDBClient\UpdatePolicy as ArangoUpdatePolicy; - -// set up some basic connection options -$connectionOptions = [ - // database name - ArangoConnectionOptions::OPTION_DATABASE => '_system', - // server endpoint to connect to - ArangoConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529', - // authorization type to use (currently supported: 'Basic') - ArangoConnectionOptions::OPTION_AUTH_TYPE => 'Basic', - // user for basic authorization - ArangoConnectionOptions::OPTION_AUTH_USER => 'root', - // password for basic authorization - ArangoConnectionOptions::OPTION_AUTH_PASSWD => '', - // connection persistence on server. can use either 'Close' (one-time connections) or 'Keep-Alive' (re-used connections) - ArangoConnectionOptions::OPTION_CONNECTION => 'Keep-Alive', - // connect timeout in seconds - ArangoConnectionOptions::OPTION_TIMEOUT => 3, - // whether or not to reconnect when a keep-alive connection has timed out on server - ArangoConnectionOptions::OPTION_RECONNECT => true, - // optionally create new collections when inserting documents - ArangoConnectionOptions::OPTION_CREATE => true, - // optionally create new collections when inserting documents - ArangoConnectionOptions::OPTION_UPDATE_POLICY => ArangoUpdatePolicy::LAST, -]; - - -// turn on exception logging (logs to whatever PHP is configured) -ArangoException::enableLogging(); - - - $connection = new ArangoConnection($connectionOptions); - -``` - -This will make the client connect to ArangoDB - -- running on localhost (OPTION_HOST) -- on the default port 8529 (OPTION_PORT) -- with a connection timeout of 3 seconds (OPTION_TIMEOUT) - -When creating new documents in a collection that does not yet exist, you have the following choices: - -- auto-generate a new collection: if you prefer that, set OPTION_CREATE to true -- fail with an error: if you prefer this behavior, set OPTION_CREATE to false - -When updating a document that was previously/concurrently updated by another user, you can select between the following behaviors: - -- last update wins: if you prefer this, set OPTION_UPDATE_POLICY to last -- fail with a conflict error: if you prefer that, set OPTION_UPDATE_POLICY to conflict - -## Setting up active failover - -By default the PHP client will connect to a single endpoint only, -by specifying a string value for the endpoint in the `ConnectionOptions`, -e.g. - -```php -$connectionOptions = [ - ArangoConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529' -]; -``` - -To set up multiple servers to connect to, it is also possible to specify -an array of servers instead: - -```php -$connectionOptions = [ - ConnectionOptions::OPTION_ENDPOINT => [ 'tcp://localhost:8531', 'tcp://localhost:8532', 'tcp://localhost:8530' ] -]; -``` - -Using this option requires ArangoDB 3.3 or higher and the database running -in active failover mode. - -The driver will by default try to connect to the first server endpoint in the -endpoints array, and only try the following servers if no connection can be -established. If no connection can be made to any server, the driver will throw -an exception. - -As it is unknown to the driver which server from the array is the current -leader, the driver will connect to the specified servers in array order by -default. However, to spare a few unnecessary connection attempts to failed -servers, it is possible to set up caching (using Memcached) for the server list. -The cached value will contain the last working server first, so that as few -connection attempts as possible will need to be made. - -In order to use this caching, it is required to install the Memcached module -for PHP, and to set up the following relevant options in the `ConnectionOptions`: - -```php -$connectionOptions = [ - // memcached persistent id (will be passed to Memcached::__construct) - ConnectionOptions::OPTION_MEMCACHED_PERSISTENT_ID => 'arangodb-php-pool', - - // memcached servers to connect to (will be passed to Memcached::addServers) - ConnectionOptions::OPTION_MEMCACHED_SERVERS => [ [ '127.0.0.1', 11211 ] ], - - // memcached options (will be passed to Memcached::setOptions) - ConnectionOptions::OPTION_MEMCACHED_OPTIONS => [ ], - - // key to store the current endpoints array under - ConnectionOptions::OPTION_MEMCACHED_ENDPOINTS_KEY => 'arangodb-php-endpoints' - - // time-to-live for the endpoints array stored in memcached - ConnectionOptions::OPTION_MEMCACHED_TTL => 600 -]; -``` - -## Creating a collection - -*This is just to show how a collection is created.* -*For these examples it is not needed to create a collection prior to inserting a document, as we set ArangoConnectionOptions::OPTION_CREATE to true.* - -So, after we get the settings, we can start with creating a collection. We will create a collection named "users". - -The below code will first set up the collection locally in a variable name $user, and then push it to the server and return the collection id created by the server: - -```php - $collectionHandler = new ArangoCollectionHandler($connection); - - // clean up first - if ($collectionHandler->has('users')) { - $collectionHandler->drop('users'); - } - if ($collectionHandler->has('example')) { - $collectionHandler->drop('example'); - } - - // create a new collection - $userCollection = new ArangoCollection(); - $userCollection->setName('users'); - $id = $collectionHandler->create($userCollection); - - // print the collection id created by the server - var_dump($id); - // check if the collection exists - $result = $collectionHandler->has('users'); - var_dump($result); -``` - -## Creating a document - -After we created the collection, we can start with creating an initial document. We will create a user document in a collection named "users". This collection does not need to exist yet. The first document we'll insert in this collection will create the collection on the fly. This is because we have set OPTION_CREATE to true in $connectionOptions. - -The below code will first set up the document locally in a variable name $user, and then push it to the server and return the document id created by the server: - -```php - $handler = new ArangoDocumentHandler($connection); - - // create a new document - $user = new ArangoDocument(); - - // use set method to set document properties - $user->set('name', 'John'); - $user->set('age', 25); - $user->set('thisIsNull', null); - - // use magic methods to set document properties - $user->likes = ['fishing', 'hiking', 'swimming']; - - // send the document to the server - $id = $handler->save('users', $user); - - // check if a document exists - $result = $handler->has('users', $id); - var_dump($result); - - // print the document id created by the server - var_dump($id); - var_dump($user->getId()); -``` - -Document properties can be set by using the set() method, or by directly manipulating the document properties. - -As you can see, sending a document to the server is achieved by calling the save() method on the client library's *DocumentHandler* class. It needs the collection name ("users" in this case") plus the document object to be saved. save() will return the document id as created by the server. The id is a numeric value that might or might not fit in a PHP integer. - -## Adding exception handling - -The above code will work but it does not check for any errors. To make it work in the face of errors, we'll wrap it into some basic exception handlers - -```php -try { - $handler = new ArangoDocumentHandler($connection); - - // create a new document - $user = new ArangoDocument(); - - // use set method to set document properties - $user->set('name', 'John'); - $user->set('age', 25); - - // use magic methods to set document properties - $user->likes = ['fishing', 'hiking', 'swimming']; - - // send the document to the server - $id = $handler->save('users', $user); - - // check if a document exists - $result = $handler->has('users', $id); - var_dump($result); - - // print the document id created by the server - var_dump($id); - var_dump($user->getId()); -} catch (ArangoConnectException $e) { - print 'Connection error: ' . $e->getMessage() . PHP_EOL; -} catch (ArangoClientException $e) { - print 'Client error: ' . $e->getMessage() . PHP_EOL; -} catch (ArangoServerException $e) { - print 'Server error: ' . $e->getServerCode() . ':' . $e->getServerMessage() . ' ' . $e->getMessage() . PHP_EOL; -} -``` - -## Retrieving a document - -To retrieve a document from the server, the get() method of the *DocumentHandler* class can be used. It needs the collection name plus a document id. There is also the getById() method which is an alias for get(). - -```php - // get the document back from the server - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); - -/* -The result of the get() method is a Document object that you can use in an OO fashion: - -object(ArangoDBClient\Document)##6 (4) { - ["_id":"ArangoDBClient\Document":private]=> - string(15) "2377907/4818344" - ["_rev":"ArangoDBClient\Document":private]=> - int(4818344) - ["_values":"ArangoDBClient\Document":private]=> - array(3) { - ["age"]=> - int(25) - ["name"]=> - string(4) "John" - ["likes"]=> - array(3) { - [0]=> - string(7) "fishing" - [1]=> - string(6) "hiking" - [2]=> - string(8) "swimming" - } - } - ["_changed":"ArangoDBClient\Document":private]=> - bool(false) -} -*/ -``` - -Whenever the document id is yet unknown, but you want to fetch a document from the server by any of its other properties, you can use the CollectionHandler->byExample() method. It allows you to provide an example of the document that you are looking for. The example should either be a Document object with the relevant properties set, or, a PHP array with the properties that you are looking for: - -```php - // get a document list back from the server, using a document example - $cursor = $collectionHandler->byExample('users', ['name' => 'John']); - var_dump($cursor->getAll()); - -``` - -This will return all documents from the specified collection (here: "users") with the properties provided in the example (here: that have an attribute "name" with a value of "John"). The result is a cursor which can be iterated sequentially or completely. We have chosen to get the complete result set above by calling the cursor's getAll() method. -Note that CollectionHandler->byExample() might return multiple documents if the example is ambiguous. - -## Updating a document - -To update an existing document, the update() method of the *DocumentHandler* class can be used. -In this example we want to -- set state to 'ca' -- change the `likes` array. - -```php - // update a document - $userFromServer->likes = ['fishing', 'swimming']; - $userFromServer->state = 'CA'; - - $result = $handler->update($userFromServer); - var_dump($result); - - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); - -``` - -To remove an attribute using the update() method, an option has to be passed telling it to not keep attributes with null values. -In this example we want to -- remove the `age` - -```php - // update a document removing an attribute, - // The 'keepNull'=>false option will cause ArangoDB to - // remove all attributes in the document, - // that have null as their value - not only the ones defined here - - $userFromServer->likes = ['fishing', 'swimming']; - $userFromServer->state = 'CA'; - $userFromServer->age = null; - - $result = $handler->update($userFromServer, ['keepNull' => false]); - var_dump($result); - - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); -``` - -To completely replace an existing document, the replace() method of the *DocumentHandler* class can be used. -In this example we want to remove the `state` attribute. - -```php - // replace a document (notice that we are using the previously fetched document) - // In this example we are removing the state attribute - unset($userFromServer->state); - - $result = $handler->replace($userFromServer); - var_dump($result); - - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); -``` - -The document that is replaced using the previous example must have been fetched from the server before. If you want to update a document without having fetched it from the server before, use updateById(): - -```php - // replace a document, identified by collection and document id - $user = new ArangoDocument(); - $user->name = 'John'; - $user->likes = ['Running', 'Rowing']; - $userFromServer->state = 'CA'; - - // Notice that for the example we're getting the existing - // document id via a method call. Normally we would use the known id - $result = $handler->replaceById('users', $userFromServer->getId(), $user); - var_dump($result); - - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); - -``` - -## Deleting a document - -To remove an existing document on the server, the remove() method of the *DocumentHandler* class will do. remove() just needs the document to be removed as a parameter: - -```php - // remove a document on the server, using a document object - $result = $handler->remove($userFromServer); - var_dump($result); -``` - -Note that the document must have been fetched from the server before. If you haven't fetched the document from the server before, use the removeById() method. This requires just the collection name (here: "users") and the document id. - -```php - // remove a document on the server, using a collection id and document id - // In this example, we are using the id of the document we deleted in the previous example, - // so it will throw an exception here. (we are catching it though, in order to continue) - - try { - $result = $handler->removeById('users', $userFromServer->getId()); - } catch (\ArangoDBClient\ServerException $e) { - $e->getMessage(); - } -``` - -## Running an AQL query - -To run an AQL query, use the *Statement* class. - -The method Statement::execute creates a Cursor object which can be used to iterate over -the query's result set. - -```php - // create a statement to insert 1000 test users - $statement = new ArangoStatement( - $connection, [ - 'query' => 'FOR i IN 1..1000 INSERT { _key: CONCAT("test", i) } IN users' - ] - ); - - // execute the statement - $cursor = $statement->execute(); - - - // now run another query on the data, using bind parameters - $statement = new ArangoStatement( - $connection, [ - 'query' => 'FOR u IN @@collection FILTER u.name == @name RETURN u', - 'bindVars' => [ - '@collection' => 'users', - 'name' => 'John' - ] - ] - ); - - // executing the statement returns a cursor - $cursor = $statement->execute(); - - // easiest way to get all results returned by the cursor - var_dump($cursor->getAll()); - - // to get statistics for the query, use Cursor::getExtra(); - var_dump($cursor->getExtra()); - -``` - -Note: by default the Statement object will create a Cursor that converts each value into -a Document object. This is normally the intended behavior for AQL queries that return -entire documents. However, an AQL query can also return projections or any other data -that cannot be converted into Document objects. - -In order to suppress the conversion into Document objects, the Statement must be given -the `_flat` attribute. This allows processing the results of arbitrary AQL queries: - -```php - // run an AQL query that does not return documents but scalars - // we need to set the _flat attribute of the Statement in order for this to work - $statement = new ArangoStatement( - $connection, [ - 'query' => 'FOR i IN 1..1000 RETURN i', - '_flat' => true - ] - ); - - // executing the statement returns a cursor - $cursor = $statement->execute(); - - // easiest way to get all results returned by the cursor - // note that now the results won't be converted into Document objects - var_dump($cursor->getAll()); - -``` - -## Exporting data - -To export the contents of a collection to PHP, use the *Export* class. -The *Export* class will create a light-weight cursor over all documents -of the specified collection. The results can be transferred to PHP -in chunks incrementally. This is the most efficient way of iterating -over all documents in a collection. - -```php - // creates an export object for collection users - $export = new ArangoExport($connection, 'users', []); - - // execute the export. this will return a special, forward-only cursor - $cursor = $export->execute(); - - // now we can fetch the documents from the collection in blocks - while ($docs = $cursor->getNextBatch()) { - // do something with $docs - var_dump($docs); - } - - // the export can also be restricted to just a few attributes per document: - $export = new ArangoExport( - $connection, 'users', [ - '_flat' => true, - 'restrict' => [ - 'type' => 'include', - 'fields' => ['_key', 'likes'] - ] - ] - ); - - // now fetch just the configured attributes for each document - while ($docs = $cursor->getNextBatch()) { - // do something with $docs - var_dump($docs); - } -``` - -## Bulk document handling - -The ArangoDB-PHP driver provides a mechanism to easily fetch multiple documents from -the same collection with a single request. All that needs to be provided is an array -of document keys: - -```php - $exampleCollection = new ArangoCollection(); - $exampleCollection->setName('example'); - $id = $collectionHandler->create($exampleCollection); - - // create a statement to insert 100 example documents - $statement = new ArangoStatement( - $connection, [ - 'query' => 'FOR i IN 1..100 INSERT { _key: CONCAT("example", i), value: i } IN example' - ] - ); - $statement->execute(); - - // later on, we can assemble a list of document keys - $keys = []; - for ($i = 1; $i <= 100; ++$i) { - $keys[] = 'example' . $i; - } - // and fetch all the documents at once - $documents = $collectionHandler->lookupByKeys('example', $keys); - var_dump($documents); - - // we can also bulk-remove them: - $result = $collectionHandler->removeByKeys('example', $keys); - - var_dump($result); -``` - -## Dropping a collection - -To drop an existing collection on the server, use the drop() method of the *CollectionHandler* class. -drop() just needs the name of the collection name to be dropped: - -```php - // drop a collection on the server, using its name, - $result = $collectionHandler->drop('users'); - var_dump($result); - - // drop the other one we created, too - $collectionHandler->drop('example'); -``` - -# Custom Document class - -If you want to use custom document class you can pass it's name to DocumentHandler or CollectionHandler using method `setDocumentClass`. -Remember that Your class must extend `\ArangoDBClient\Document`. - -```php -$ch = new CollectionHandler($connection); -$ch->setDocumentClass('\AppBundle\Entity\Product'); -$cursor = $ch->all('product'); -// All returned documents will be \AppBundle\Entity\Product instances - - -$dh = new DocumentHandler($connection); -$dh->setDocumentClass('\AppBundle\Entity\Product'); -$product = $dh->get('products', 11231234); -// Product will be \AppBundle\Entity\Product instance -``` - -See file examples/customDocumentClass.php for more details. - -## Logging exceptions - -The driver provides a simple logging mechanism that is turned off by default. If it is turned on, the driver -will log all its exceptions using PHP's standard `error_log` mechanism. It will call PHP's `error_log()` -function for this. It depends on the PHP configuration if and where exceptions will be logged. Please consult -your php.ini settings for further details. - -To turn on exception logging in the driver, set a flag on the driver's Exception base class, from which all -driver exceptions are subclassed: - -```php -use ArangoDBClient\Exception as ArangoException; - -ArangoException::enableLogging(); -``` - -To turn logging off, call its `disableLogging` method: - -```php -use ArangoDBClient\Exception as ArangoException; - -ArangoException::disableLogging(); -``` - -## Putting it all together - -Here's the full code that combines all the pieces outlined above: - -```php -// use the following line when using Composer -// require __DIR__ . '/vendor/composer/autoload.php'; - -// use the following line when using git -require __DIR__ . '/autoload.php'; - -// set up some aliases for less typing later -use ArangoDBClient\Collection as ArangoCollection; -use ArangoDBClient\CollectionHandler as ArangoCollectionHandler; -use ArangoDBClient\Connection as ArangoConnection; -use ArangoDBClient\ConnectionOptions as ArangoConnectionOptions; -use ArangoDBClient\DocumentHandler as ArangoDocumentHandler; -use ArangoDBClient\Document as ArangoDocument; -use ArangoDBClient\Exception as ArangoException; -use ArangoDBClient\Export as ArangoExport; -use ArangoDBClient\ConnectException as ArangoConnectException; -use ArangoDBClient\ClientException as ArangoClientException; -use ArangoDBClient\ServerException as ArangoServerException; -use ArangoDBClient\Statement as ArangoStatement; -use ArangoDBClient\UpdatePolicy as ArangoUpdatePolicy; - -// set up some basic connection options -$connectionOptions = [ - // database name - ArangoConnectionOptions::OPTION_DATABASE => '_system', - // server endpoint to connect to - ArangoConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529', - // authorization type to use (currently supported: 'Basic') - ArangoConnectionOptions::OPTION_AUTH_TYPE => 'Basic', - // user for basic authorization - ArangoConnectionOptions::OPTION_AUTH_USER => 'root', - // password for basic authorization - ArangoConnectionOptions::OPTION_AUTH_PASSWD => '', - // connection persistence on server. can use either 'Close' (one-time connections) or 'Keep-Alive' (re-used connections) - ArangoConnectionOptions::OPTION_CONNECTION => 'Keep-Alive', - // connect timeout in seconds - ArangoConnectionOptions::OPTION_TIMEOUT => 3, - // whether or not to reconnect when a keep-alive connection has timed out on server - ArangoConnectionOptions::OPTION_RECONNECT => true, - // optionally create new collections when inserting documents - ArangoConnectionOptions::OPTION_CREATE => true, - // optionally create new collections when inserting documents - ArangoConnectionOptions::OPTION_UPDATE_POLICY => ArangoUpdatePolicy::LAST, -]; - - -// turn on exception logging (logs to whatever PHP is configured) -ArangoException::enableLogging(); - -try { - $connection = new ArangoConnection($connectionOptions); - - $collectionHandler = new ArangoCollectionHandler($connection); - - // clean up first - if ($collectionHandler->has('users')) { - $collectionHandler->drop('users'); - } - if ($collectionHandler->has('example')) { - $collectionHandler->drop('example'); - } - - // create a new collection - $userCollection = new ArangoCollection(); - $userCollection->setName('users'); - $id = $collectionHandler->create($userCollection); - - // print the collection id created by the server - var_dump($id); - - // check if the collection exists - $result = $collectionHandler->has('users'); - var_dump($result); - - $handler = new ArangoDocumentHandler($connection); - - // create a new document - $user = new ArangoDocument(); - - // use set method to set document properties - $user->set('name', 'John'); - $user->set('age', 25); - $user->set('thisIsNull', null); - - // use magic methods to set document properties - $user->likes = ['fishing', 'hiking', 'swimming']; - - // send the document to the server - $id = $handler->save('users', $user); - - // check if a document exists - $result = $handler->has('users', $id); - var_dump($result); - - // print the document id created by the server - var_dump($id); - var_dump($user->getId()); - - - // get the document back from the server - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); - - // get a document list back from the server, using a document example - $cursor = $collectionHandler->byExample('users', ['name' => 'John']); - var_dump($cursor->getAll()); - - - // update a document - $userFromServer->likes = ['fishing', 'swimming']; - $userFromServer->state = 'CA'; - - $result = $handler->update($userFromServer); - var_dump($result); - - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); - - - // update a document removing an attribute, - // The 'keepNull'=>false option will cause ArangoDB to - // remove all attributes in the document, - // that have null as their value - not only the ones defined here - - $userFromServer->likes = ['fishing', 'swimming']; - $userFromServer->state = 'CA'; - $userFromServer->age = null; - - $result = $handler->update($userFromServer, ['keepNull' => false]); - var_dump($result); - - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); - - - // replace a document (notice that we are using the previously fetched document) - // In this example we are removing the state attribute - unset($userFromServer->state); - - $result = $handler->replace($userFromServer); - var_dump($result); - - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); - - - // replace a document, identified by collection and document id - $user = new ArangoDocument(); - $user->name = 'John'; - $user->likes = ['Running', 'Rowing']; - $userFromServer->state = 'CA'; - - // Notice that for the example we're getting the existing - // document id via a method call. Normally we would use the known id - $result = $handler->replaceById('users', $userFromServer->getId(), $user); - var_dump($result); - - $userFromServer = $handler->get('users', $id); - var_dump($userFromServer); - - - // remove a document on the server - $result = $handler->remove($userFromServer); - var_dump($result); - - - // remove a document on the server, using a collection id and document id - // In this example, we are using the id of the document we deleted in the previous example, - // so it will throw an exception here. (we are catching it though, in order to continue) - - try { - $result = $handler->removeById('users', $userFromServer->getId()); - } catch (\ArangoDBClient\ServerException $e) { - $e->getMessage(); - } - - - - // create a statement to insert 1000 test users - $statement = new ArangoStatement( - $connection, [ - 'query' => 'FOR i IN 1..1000 INSERT { _key: CONCAT("test", i) } IN users' - ] - ); - - // execute the statement - $cursor = $statement->execute(); - - - // now run another query on the data, using bind parameters - $statement = new ArangoStatement( - $connection, [ - 'query' => 'FOR u IN @@collection FILTER u.name == @name RETURN u', - 'bindVars' => [ - '@collection' => 'users', - 'name' => 'John' - ] - ] - ); - - // executing the statement returns a cursor - $cursor = $statement->execute(); - - // easiest way to get all results returned by the cursor - var_dump($cursor->getAll()); - - // to get statistics for the query, use Cursor::getExtra(); - var_dump($cursor->getExtra()); - - - // creates an export object for collection users - $export = new ArangoExport($connection, 'users', []); - - // execute the export. this will return a special, forward-only cursor - $cursor = $export->execute(); - - // now we can fetch the documents from the collection in blocks - while ($docs = $cursor->getNextBatch()) { - // do something with $docs - var_dump($docs); - } - - // the export can also be restricted to just a few attributes per document: - $export = new ArangoExport( - $connection, 'users', [ - '_flat' => true, - 'restrict' => [ - 'type' => 'include', - 'fields' => ['_key', 'likes'] - ] - ] - ); - - // now fetch just the configured attributes for each document - while ($docs = $cursor->getNextBatch()) { - // do something with $docs - var_dump($docs); - } - - - $exampleCollection = new ArangoCollection(); - $exampleCollection->setName('example'); - $id = $collectionHandler->create($exampleCollection); - - // create a statement to insert 100 example documents - $statement = new ArangoStatement( - $connection, [ - 'query' => 'FOR i IN 1..100 INSERT { _key: CONCAT("example", i), value: i } IN example' - ] - ); - $statement->execute(); - - // later on, we can assemble a list of document keys - $keys = []; - for ($i = 1; $i <= 100; ++$i) { - $keys[] = 'example' . $i; - } - // and fetch all the documents at once - $documents = $collectionHandler->lookupByKeys('example', $keys); - var_dump($documents); - - // we can also bulk-remove them: - $result = $collectionHandler->removeByKeys('example', $keys); - - var_dump($result); - - - // drop a collection on the server, using its name, - $result = $collectionHandler->drop('users'); - var_dump($result); - - // drop the other one we created, too - $collectionHandler->drop('example'); -} catch (ArangoConnectException $e) { - print 'Connection error: ' . $e->getMessage() . PHP_EOL; -} catch (ArangoClientException $e) { - print 'Client error: ' . $e->getMessage() . PHP_EOL; -} catch (ArangoServerException $e) { - print 'Server error: ' . $e->getServerCode() . ': ' . $e->getServerMessage() . ' - ' . $e->getMessage() . PHP_EOL; -} - -``` From 294a8ba3198780b0cdd66b2b2b73841f838b9dfa Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 18 Mar 2020 09:42:51 +0100 Subject: [PATCH 033/101] include 3.7 branch --- CHANGELOG.md | 5 +++++ README.md | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 168400b1..6d13c95d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Release notes for the ArangoDB-PHP driver 3.7.x + +Work in progress. + + ## Release notes for the ArangoDB-PHP driver 3.6.x Deprecated `Collection::setMinReplicationFactor()` and `Collection::getMinReplicationFactor()` diff --git a/README.md b/README.md index a9a7cf09..51f10fca 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ The official ArangoDB PHP Driver. -3.2: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.2)](https://travis-ci.org/arangodb/arangodb-php) -3.3: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.3)](https://travis-ci.org/arangodb/arangodb-php) 3.4: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.4)](https://travis-ci.org/arangodb/arangodb-php) 3.5: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.5)](https://travis-ci.org/arangodb/arangodb-php) +3.6: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.6)](https://travis-ci.org/arangodb/arangodb-php) +3.7: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.7)](https://travis-ci.org/arangodb/arangodb-php) devel: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=devel)](https://travis-ci.org/arangodb/arangodb-php) - [Getting Started](https://www.arangodb.com/docs/stable/drivers/php-getting-started.html) From d63bc8eaa1efbf095af86e5d4963066b26c2506e Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 18 Mar 2020 10:14:01 +0100 Subject: [PATCH 034/101] fix tests --- tests/UserBasicTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/UserBasicTest.php b/tests/UserBasicTest.php index 9c7af8f0..31f87a8c 100644 --- a/tests/UserBasicTest.php +++ b/tests/UserBasicTest.php @@ -77,7 +77,7 @@ public function testGrantPermissions() $userHandler->getDatabases('testUser42'); } catch (\Exception $e) { // Just give us the $e - static::assertEquals(401, $e->getCode()); + static::assertEquals(403, $e->getCode()); } static::assertInstanceOf(ServerException::class, $e, 'should have gotten an exception'); } @@ -169,7 +169,7 @@ public function testGrantDatabasePermissions() $userHandler->getDatabases('testUser42'); } catch (\Exception $e) { // Just give us the $e - static::assertEquals(401, $e->getCode()); + static::assertEquals(403, $e->getCode()); } static::assertInstanceOf(ServerException::class, $e, 'should have gotten an exception'); } @@ -265,7 +265,7 @@ public function testGrantCollectionPermissions() $userHandler->getCollectionPermissionLevel('testUser42', '_system', $collectionName); } catch (\Exception $e) { // Just give us the $e - static::assertEquals(401, $e->getCode(), 'Should get 401, instead got: ' . $e->getCode()); + static::assertEquals(403, $e->getCode(), 'Should get 401, instead got: ' . $e->getCode()); } static::assertInstanceOf(ServerException::class, $e, 'should have gotten an exception'); } From d4e099683f3b8e9f801d8f8d94de7ea483ff6605 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 27 Mar 2020 13:18:31 +0100 Subject: [PATCH 035/101] revert a test adjustment which was done because of a temporary issue in arangod --- tests/UserBasicTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/UserBasicTest.php b/tests/UserBasicTest.php index 31f87a8c..9c7af8f0 100644 --- a/tests/UserBasicTest.php +++ b/tests/UserBasicTest.php @@ -77,7 +77,7 @@ public function testGrantPermissions() $userHandler->getDatabases('testUser42'); } catch (\Exception $e) { // Just give us the $e - static::assertEquals(403, $e->getCode()); + static::assertEquals(401, $e->getCode()); } static::assertInstanceOf(ServerException::class, $e, 'should have gotten an exception'); } @@ -169,7 +169,7 @@ public function testGrantDatabasePermissions() $userHandler->getDatabases('testUser42'); } catch (\Exception $e) { // Just give us the $e - static::assertEquals(403, $e->getCode()); + static::assertEquals(401, $e->getCode()); } static::assertInstanceOf(ServerException::class, $e, 'should have gotten an exception'); } @@ -265,7 +265,7 @@ public function testGrantCollectionPermissions() $userHandler->getCollectionPermissionLevel('testUser42', '_system', $collectionName); } catch (\Exception $e) { // Just give us the $e - static::assertEquals(403, $e->getCode(), 'Should get 401, instead got: ' . $e->getCode()); + static::assertEquals(401, $e->getCode(), 'Should get 401, instead got: ' . $e->getCode()); } static::assertInstanceOf(ServerException::class, $e, 'should have gotten an exception'); } From 02cb1d71033adf596e9667333b3f142c8fcad327 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 22 Jul 2020 22:25:40 +0200 Subject: [PATCH 036/101] adjust error code in tests --- CHANGELOG.md | 13 ++++++++++++- tests/DocumentExtendedTest.php | 20 +++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d13c95d..f2a482be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,18 @@ ## Release notes for the ArangoDB-PHP driver 3.7.x -Work in progress. +The corresponding ArangoDB version, ArangoDB 3.7 has dropped support for the MMFiles storage +engine. Usage of the MMFiles storage engine is still supported in the 3.7 version of the PHP +driver, in order to use the driver to connect to an ArangoDB 3.6. +But MMFiles support will be dropped from the PHP driver in version 3.8. + +Updating, replacing or removing documents in the database using a revision id guard value +may return a different error message in case the revision id value of the found document is +not as expected. + +Previous versions returned HTTP error 412, an ArangoDB error code 1200 and an error message +string "precondition failed". This version now returns the same error codes, but the error +message string is changed to "conflict". ## Release notes for the ArangoDB-PHP driver 3.6.x diff --git a/tests/DocumentExtendedTest.php b/tests/DocumentExtendedTest.php index 57a9e041..13067679 100644 --- a/tests/DocumentExtendedTest.php +++ b/tests/DocumentExtendedTest.php @@ -640,7 +640,9 @@ public function testCreateUpdateGetAndDeleteDocumentWithRevisionCheck() } static::assertInstanceOf(\Exception::class, $e); - static::assertEquals('precondition failed', $e->getMessage()); + static::assertEquals(412, $e->getCode()); + static::assertEquals(1200, $e->getServerCode()); + static::assertEquals('conflict', $e->getMessage()); $resultingDocument1 = $documentHandler->get($this->collection->getName(), $documentId); static::assertEquals( @@ -685,7 +687,9 @@ public function testCreateUpdateGetAndDeleteDocumentWithRevisionCheck() } static::assertInstanceOf(\Exception::class, $e, 'Delete should have raised an exception here'); - static::assertEquals('precondition failed', $e->getMessage()); + static::assertEquals(412, $e->getCode()); + static::assertEquals(1200, $e->getServerCode()); + static::assertEquals('conflict', $e->getMessage()); unset ($e); $response = $documentHandler->remove($resultingDocument3, ['policy' => 'error']); @@ -744,7 +748,9 @@ public function testMoreCreateUpdateGetAndDeleteDocumentWithRevisionCheck() } static::assertInstanceOf(\Exception::class, $e); - static::assertEquals('precondition failed', $e->getMessage()); + static::assertEquals(412, $e->getCode()); + static::assertEquals(1200, $e->getServerCode()); + static::assertEquals('conflict', $e->getMessage()); $resultingDocument1 = $documentHandler->get($this->collection->getName(), $documentId); static::assertEquals($resultingDocument1->someAttribute, 'someValue2'); @@ -789,7 +795,9 @@ public function testMoreCreateUpdateGetAndDeleteDocumentWithRevisionCheck() } static::assertInstanceOf(\Exception::class, $e, 'Delete should have raised an exception here'); - static::assertEquals('precondition failed', $e->getMessage()); + static::assertEquals(412, $e->getCode()); + static::assertEquals(1200, $e->getServerCode()); + static::assertEquals('conflict', $e->getMessage()); unset ($e); $response = $documentHandler->remove($resultingDocument3, ['policy' => 'error']); @@ -913,7 +921,9 @@ public function testCreateSetNullAttributeUpdateGetAndDeleteDocumentWithRevision } static::assertInstanceOf(\Exception::class, $e, 'Delete should have raised an exception here'); - static::assertEquals('precondition failed', $e->getMessage()); + static::assertEquals(412, $e->getCode()); + static::assertEquals(1200, $e->getServerCode()); + static::assertEquals('conflict', $e->getMessage()); unset ($e); $response = $documentHandler->remove($resultingDocument3, ['policy' => 'error']); From 9ba49e3f01e73f8e8ebceb89cb7253c03fe782e7 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 22 Jul 2020 22:49:47 +0200 Subject: [PATCH 037/101] fix error message in tests --- CHANGELOG.md | 14 ++++++++++++++ tests/DocumentExtendedTest.php | 10 +++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2a482be..ca92ca18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## Release notes for the ArangoDB-PHP driver 3.8.x + +This version of the PHP driver removes support for the MMFiles storage engine, which was +deprecated in the arangod server in version 3.6.0, and removed in version 3.7.0.. + +Updating, replacing or removing documents in the database using a revision id guard value +may return a different error message in case the revision id value of the found document is +not as expected. +Previous versions before 3.7 returned HTTP error 412, an ArangoDB error code 1200 and the +error message string "precondition failed". This was changed in version 3.7 to return the +same error codes, but an error message string of "conflict". Version 3.8 changes this again +so the error message string is now "conflict, _rev values do not match". + + ## Release notes for the ArangoDB-PHP driver 3.7.x The corresponding ArangoDB version, ArangoDB 3.7 has dropped support for the MMFiles storage diff --git a/tests/DocumentExtendedTest.php b/tests/DocumentExtendedTest.php index 13067679..5c20ad85 100644 --- a/tests/DocumentExtendedTest.php +++ b/tests/DocumentExtendedTest.php @@ -642,7 +642,7 @@ public function testCreateUpdateGetAndDeleteDocumentWithRevisionCheck() static::assertInstanceOf(\Exception::class, $e); static::assertEquals(412, $e->getCode()); static::assertEquals(1200, $e->getServerCode()); - static::assertEquals('conflict', $e->getMessage()); + static::assertEquals('conflict, _rev values do not match', $e->getMessage()); $resultingDocument1 = $documentHandler->get($this->collection->getName(), $documentId); static::assertEquals( @@ -689,7 +689,7 @@ public function testCreateUpdateGetAndDeleteDocumentWithRevisionCheck() static::assertInstanceOf(\Exception::class, $e, 'Delete should have raised an exception here'); static::assertEquals(412, $e->getCode()); static::assertEquals(1200, $e->getServerCode()); - static::assertEquals('conflict', $e->getMessage()); + static::assertEquals('conflict, _rev values do not match', $e->getMessage()); unset ($e); $response = $documentHandler->remove($resultingDocument3, ['policy' => 'error']); @@ -750,7 +750,7 @@ public function testMoreCreateUpdateGetAndDeleteDocumentWithRevisionCheck() static::assertInstanceOf(\Exception::class, $e); static::assertEquals(412, $e->getCode()); static::assertEquals(1200, $e->getServerCode()); - static::assertEquals('conflict', $e->getMessage()); + static::assertEquals('conflict, _rev values do not match', $e->getMessage()); $resultingDocument1 = $documentHandler->get($this->collection->getName(), $documentId); static::assertEquals($resultingDocument1->someAttribute, 'someValue2'); @@ -797,7 +797,7 @@ public function testMoreCreateUpdateGetAndDeleteDocumentWithRevisionCheck() static::assertInstanceOf(\Exception::class, $e, 'Delete should have raised an exception here'); static::assertEquals(412, $e->getCode()); static::assertEquals(1200, $e->getServerCode()); - static::assertEquals('conflict', $e->getMessage()); + static::assertEquals('conflict, _rev values do not match', $e->getMessage()); unset ($e); $response = $documentHandler->remove($resultingDocument3, ['policy' => 'error']); @@ -923,7 +923,7 @@ public function testCreateSetNullAttributeUpdateGetAndDeleteDocumentWithRevision static::assertInstanceOf(\Exception::class, $e, 'Delete should have raised an exception here'); static::assertEquals(412, $e->getCode()); static::assertEquals(1200, $e->getServerCode()); - static::assertEquals('conflict', $e->getMessage()); + static::assertEquals('conflict, _rev values do not match', $e->getMessage()); unset ($e); $response = $documentHandler->remove($resultingDocument3, ['policy' => 'error']); From 867996d8192b115fae9d60152775b3260361550e Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 20 Apr 2021 14:25:17 +0200 Subject: [PATCH 038/101] fix PHP driver tests --- CHANGELOG.md | 30 +- lib/ArangoDBClient/Export.php | 274 ------------ lib/ArangoDBClient/ExportCursor.php | 292 ------------- lib/ArangoDBClient/Urls.php | 5 - tests/CustomDocumentClassTest.php | 43 -- tests/ExportTest.php | 629 ---------------------------- 6 files changed, 17 insertions(+), 1256 deletions(-) delete mode 100644 lib/ArangoDBClient/Export.php delete mode 100644 lib/ArangoDBClient/ExportCursor.php delete mode 100644 tests/ExportTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index ca92ca18..d86a94df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,21 @@ # Changelog +## Release notes for the ArangoDB-PHP driver 3.9.x + +This version of the PHP driver removes the following functionality, which was deprecated +in a previous release and is not available in ArangoDB 3.9 anymore: + +- class Export +- class ExportCursor + + ## Release notes for the ArangoDB-PHP driver 3.8.x -This version of the PHP driver removes support for the MMFiles storage engine, which was -deprecated in the arangod server in version 3.6.0, and removed in version 3.7.0.. +In this version of the PHP driver the following classes are deprecated, because their +corresponding server-side APIs have been deprecated in ArangoDB 3.8: -Updating, replacing or removing documents in the database using a revision id guard value -may return a different error message in case the revision id value of the found document is -not as expected. -Previous versions before 3.7 returned HTTP error 412, an ArangoDB error code 1200 and the -error message string "precondition failed". This was changed in version 3.7 to return the -same error codes, but an error message string of "conflict". Version 3.8 changes this again -so the error message string is now "conflict, _rev values do not match". +- class Export +- class ExportCursor ## Release notes for the ArangoDB-PHP driver 3.7.x @@ -24,10 +28,10 @@ But MMFiles support will be dropped from the PHP driver in version 3.8. Updating, replacing or removing documents in the database using a revision id guard value may return a different error message in case the revision id value of the found document is not as expected. - -Previous versions returned HTTP error 412, an ArangoDB error code 1200 and an error message -string "precondition failed". This version now returns the same error codes, but the error -message string is changed to "conflict". +Previous versions before 3.7 returned HTTP error 412, an ArangoDB error code 1200 and the +error message string "precondition failed". This was changed in version 3.7 to return the +same error codes, but an error message string of "conflict". Version 3.8 changes this again +so the error message string is now "conflict, _rev values do not match". ## Release notes for the ArangoDB-PHP driver 3.6.x diff --git a/lib/ArangoDBClient/Export.php b/lib/ArangoDBClient/Export.php deleted file mode 100644 index 70b95ef0..00000000 --- a/lib/ArangoDBClient/Export.php +++ /dev/null @@ -1,274 +0,0 @@ -_connection = $connection; - - if (!($collection instanceof Collection)) { - $collectionHandler = new CollectionHandler($this->_connection); - $collection = $collectionHandler->get($collection); - } - $this->_collection = $collection; - - // check if we're working with an edge collection or not - $this->_type = $this->_collection->getType(); - - if (isset($data[self::ENTRY_FLUSH])) { - // set a default value - $this->_flush = $data[self::ENTRY_FLUSH]; - } - - if (isset($data[self::ENTRY_BATCHSIZE])) { - $this->setBatchSize($data[self::ENTRY_BATCHSIZE]); - } - - if (isset($data[self::ENTRY_LIMIT])) { - $this->_limit = (int) $data[self::ENTRY_LIMIT]; - } - - if (isset($data[self::ENTRY_RESTRICT]) && - is_array($data[self::ENTRY_RESTRICT]) - ) { - $restrictions = $data[self::ENTRY_RESTRICT]; - - if (!isset($restrictions['type']) || - !in_array($restrictions['type'], ['include', 'exclude'], true) - ) { - // validate restrictions.type - throw new ClientException('Invalid restrictions type definition'); - } - - if (!isset($restrictions['fields']) || - !is_array($restrictions['fields']) - ) { - // validate restrictions.fields - throw new ClientException('Invalid restrictions fields definition'); - } - - // all valid - $this->_restrictions = $restrictions; - } - - if (isset($data[ExportCursor::ENTRY_FLAT])) { - $this->_flat = (bool) $data[ExportCursor::ENTRY_FLAT]; - } - } - - /** - * Return the connection object - * - * @return Connection - the connection object - */ - protected function getConnection() - { - return $this->_connection; - } - - /** - * Execute the export - * - * This will return the results as a Cursor. The cursor can then be used to iterate the results. - * - * @throws Exception - * @return ExportCursor - */ - public function execute() - { - $data = [ - self::ENTRY_FLUSH => $this->_flush, - self::ENTRY_COUNT => true - ]; - - if ($this->_batchSize > 0) { - $data[self::ENTRY_BATCHSIZE] = $this->_batchSize; - } - - if ($this->_limit > 0) { - $data[self::ENTRY_LIMIT] = $this->_limit; - } - - if (is_array($this->_restrictions)) { - $data[self::ENTRY_RESTRICT] = $this->_restrictions; - } - - $collection = $this->_collection; - if ($collection instanceof Collection) { - $collection = $collection->getName(); - } - - $url = UrlHelper::appendParamsUrl(Urls::URL_EXPORT, ['collection' => $collection]); - $response = $this->_connection->post($url, $this->getConnection()->json_encode_wrapper($data)); - - return new ExportCursor($this->_connection, $response->getJson(), $this->getCursorOptions()); - } - - /** - * Set the batch size for the export - * - * The batch size is the number of results to be transferred - * in one server round-trip. If an export produces more documents - * than the batch size, it creates a server-side cursor that - * provides the additional results. - * - * The server-side cursor can be accessed by the client with subsequent HTTP requests. - * - * @throws ClientException - * - * @param int $value - batch size value - * - * @return void - */ - public function setBatchSize($value) - { - if (!is_int($value) || (int) $value <= 0) { - throw new ClientException('Batch size should be a positive integer'); - } - - $this->_batchSize = (int) $value; - } - - /** - * Get the batch size for the export - * - * @return int - current batch size value - */ - public function getBatchSize() - { - return $this->_batchSize; - } - - /** - * Return an array of cursor options - * - * @return array - array of options - */ - private function getCursorOptions() - { - $result = [ - ExportCursor::ENTRY_FLAT => (bool) $this->_flat, - ExportCursor::ENTRY_BASEURL => Urls::URL_EXPORT, - ExportCursor::ENTRY_TYPE => $this->_type, - '_documentClass' => $this->_documentClass, - ]; - - return $result; - } -} - -class_alias(Export::class, '\triagens\ArangoDb\Export'); diff --git a/lib/ArangoDBClient/ExportCursor.php b/lib/ArangoDBClient/ExportCursor.php deleted file mode 100644 index 37eadade..00000000 --- a/lib/ArangoDBClient/ExportCursor.php +++ /dev/null @@ -1,292 +0,0 @@ - - * - * If the result set is too big to be transferred in one go, the - * cursor might issue additional HTTP requests to fetch the - * remaining results from the server. - * - * @package ArangoDBClient - * @since 2.6 - */ -class ExportCursor -{ - /** - * Import $_documentClass functionality - */ - use DocumentClassable; - - /** - * The connection object - * - * @var Connection - */ - private $_connection; - - /** - * Cursor options - * - * @var array - */ - private $_options; - - /** - * The current result set - * - * @var array - */ - private $_result; - - /** - * "has more" indicator - if true, the server has more results - * - * @var bool - */ - private $_hasMore; - - /** - * cursor id - might be NULL if cursor does not have an id - * - * @var mixed - */ - private $_id; - - /** - * number of HTTP calls that were made to build the cursor result - */ - private $_fetches = 1; - - /** - * result entry for cursor id - */ - const ENTRY_ID = 'id'; - - /** - * result entry for "hasMore" flag - */ - const ENTRY_HASMORE = 'hasMore'; - - /** - * result entry for result documents - */ - const ENTRY_RESULT = 'result'; - - /** - * "flat" option entry (will treat the results as a simple array, not documents) - */ - const ENTRY_FLAT = '_flat'; - - /** - * result entry for document count - */ - const ENTRY_COUNT = 'count'; - - /** - * "type" option entry (is used when converting the result into documents or edges objects) - */ - const ENTRY_TYPE = 'type'; - - /** - * "baseurl" option entry. - */ - const ENTRY_BASEURL = 'baseurl'; - - /** - * Initialize the cursor with the first results and some metadata - * - * @param Connection $connection - connection to be used - * @param array $data - initial result data as returned by the server - * @param array $options - cursor options - * - * @throws \ArangoDBClient\ClientException - */ - public function __construct(Connection $connection, array $data, array $options) - { - $this->_connection = $connection; - $this->data = $data; - $this->_id = null; - - if (isset($data[self::ENTRY_ID])) { - $this->_id = $data[self::ENTRY_ID]; - } - - if (isset($options['_documentClass'])) { - $this->setDocumentClass($options['_documentClass']); - } - - // attribute must be there - assert(isset($data[self::ENTRY_HASMORE])); - $this->_hasMore = (bool) $data[self::ENTRY_HASMORE]; - - $this->_options = $options; - $this->_result = []; - $this->setData((array) $data[self::ENTRY_RESULT]); - } - - - /** - * Explicitly delete the cursor - * - * This might issue an HTTP DELETE request to inform the server about - * the deletion. - * - * @throws Exception - * @return bool - true if the server acknowledged the deletion request, false otherwise - */ - public function delete() - { - if ($this->_id) { - try { - $this->_connection->delete($this->url() . '/' . $this->_id); - - return true; - } catch (Exception $e) { - } - } - - return false; - } - - - /** - * Get the total number of results in the export - * - * @return int - total number of results - */ - public function getCount() - { - return $this->data[self::ENTRY_COUNT]; - } - - /** - * Get next results as an array - * - * This might issue additional HTTP requests to fetch any outstanding - * results from the server - * - * @throws Exception - * @return mixed - an array with the next results or false if the cursor is exhausted - */ - public function getNextBatch() - { - if ($this->_result === [] && $this->_hasMore) { - // read more from server - $this->fetchOutstanding(); - } - - if ($this->_result !== []) { - $result = $this->_result; - $this->_result = []; - - return $result; - } - - // cursor is exhausted - return false; - } - - /** - * Create an array of results from the input array - * - * @param array $data - incoming result - * - * @return void - * @throws \ArangoDBClient\ClientException - */ - private function setData(array $data) - { - $_documentClass = $this->_documentClass; - $_edgeClass = $this->_edgeClass; - - if (isset($this->_options[self::ENTRY_FLAT]) && $this->_options[self::ENTRY_FLAT]) { - $this->_result = $data; - } else { - $this->_result = []; - - if ($this->_options[self::ENTRY_TYPE] === Collection::TYPE_EDGE) { - foreach ($data as $row) { - $this->_result[] = $_edgeClass::createFromArray($row, $this->_options); - } - } else { - foreach ($data as $row) { - $this->_result[] = $_documentClass::createFromArray($row, $this->_options); - } - } - } - } - - - /** - * Fetch outstanding results from the server - * - * @throws Exception - * @return void - */ - private function fetchOutstanding() - { - // continuation - $response = $this->_connection->put($this->url() . '/' . $this->_id, ''); - ++$this->_fetches; - - $data = $response->getJson(); - - $this->_hasMore = (bool) $data[self::ENTRY_HASMORE]; - $this->setData($data[self::ENTRY_RESULT]); - - if (!$this->_hasMore) { - // we have fetched the complete result set and can unset the id now - $this->_id = null; - } - } - - /** - * Return the base URL for the cursor - * - * @return string - */ - private function url() - { - if (isset($this->_options[self::ENTRY_BASEURL])) { - return $this->_options[self::ENTRY_BASEURL]; - } - - // this is the default - return Urls::URL_EXPORT; - } - - /** - * Return the number of HTTP calls that were made to build the cursor result - * - * @return int - */ - public function getFetches() - { - return $this->_fetches; - } - - /** - * Return the cursor id, if any - * - * @return string - */ - public function getId() - { - return $this->_id; - } - -} - -class_alias(ExportCursor::class, '\triagens\ArangoDb\ExportCursor'); diff --git a/lib/ArangoDBClient/Urls.php b/lib/ArangoDBClient/Urls.php index 5b1e7c9d..0f7012e0 100644 --- a/lib/ArangoDBClient/Urls.php +++ b/lib/ArangoDBClient/Urls.php @@ -73,11 +73,6 @@ abstract class Urls */ const URL_CURSOR = '/_api/cursor'; - /** - * URL for export related operations - */ - const URL_EXPORT = '/_api/export'; - /** * URL for AQL explain-related operations */ diff --git a/tests/CustomDocumentClassTest.php b/tests/CustomDocumentClassTest.php index 872726dd..b3e3552a 100644 --- a/tests/CustomDocumentClassTest.php +++ b/tests/CustomDocumentClassTest.php @@ -124,49 +124,6 @@ public function testGetCustomDocumentWithStatement() $documentHandler->remove($document); } - /** - * Try to retrieve a custom document class via Export. - */ - public function testGetCustomDocumentWithExport() - { - if (isCluster($this->connection)) { - $this->markTestSkipped("test is only meaningful in single server"); - } - - $connection = $this->connection; - $collection = $this->collection; - $document = new Document(); - $documentHandler = new DocumentHandler($connection); - - $document->someAttribute = 'exportValue'; - - $documentHandler->save($collection->getName(), $document); - - $export = new Export($connection, $collection->getName(), [ - 'batchSize' => 5000, - '_flat' => false, - 'flush' => true, - ]); - - // execute the export. this will return a special, forward-only cursor - $export->setDocumentClass(CustomDocumentClass1::class); - $cursor = $export->execute(); - - $found = false; - while ($docs = $cursor->getNextBatch()) { - $found = true; - static::assertTrue(count($docs) > 0, 'No documents retrieved!'); - foreach ($docs as $doc) { - static::assertInstanceOf(CustomDocumentClass1::class, $doc, 'Retrieved document isn\'t made with provided CustomDocumentClass1!'); - static::assertSame('exportValue', $doc->someAttribute, 'Expected value exportValue, found :' . $doc->someAttribute); - } - } - - static::assertTrue($found, 'No batch results in Export'); - - $documentHandler->remove($document); - } - public function testGetCustomDocumentWithBatch() { $connection = $this->connection; diff --git a/tests/ExportTest.php b/tests/ExportTest.php deleted file mode 100644 index 7fe931d9..00000000 --- a/tests/ExportTest.php +++ /dev/null @@ -1,629 +0,0 @@ -connection = getConnection(); - $this->collectionHandler = new CollectionHandler($this->connection); - - // clean up first - try { - $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection' . '_' . static::$testsTimestamp); - } catch (\Exception $e) { - // don't bother us, if it's already deleted. - } - - $this->collection = new Collection(); - $this->collection->setName('ArangoDB_PHP_TestSuite_TestCollection' . '_' . static::$testsTimestamp); - $this->collectionHandler->create($this->collection); - - $this->documentHandler = new DocumentHandler($this->connection); - - $adminHandler = new AdminHandler($this->connection); - $version = preg_replace('/-[a-z0-9]+$/', '', $adminHandler->getServerVersion()); - $this->hasExportApi = (version_compare($version, '2.6.0') >= 0); - if (isCluster($this->connection)) { - $this->hasExportApi = false; - } - } - - /** - * Test export empty collection - */ - public function testExportEmpty() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - return; - } - $connection = $this->connection; - - $export = new Export($connection, $this->collection, []); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNull($cursor->getId()); - - // we're not expecting any results - static::assertEquals(0, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export some documents - */ - public function testExportDocuments() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - $connection = $this->connection; - for ($i = 0; $i < 100; ++$i) { - $this->documentHandler->save($this->collection, ['value' => $i]); - } - - $export = new Export($connection, $this->collection, []); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNull($cursor->getId()); - - static::assertEquals(100, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - $all = $cursor->getNextBatch(); - static::assertCount(100, $all); - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export some documents w/ multiple fetches - */ - public function testExportDocumentsTwoFetches() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - $connection = $this->connection; - $statement = new Statement( - $connection, [ - 'query' => "FOR i IN 1..1001 INSERT { _key: CONCAT('test', i), value: i } IN " . $this->collection->getName() - ] - ); - $statement->execute(); - - $export = new Export($connection, $this->collection, []); - $cursor = $export->execute(); - - static::assertNotNull($cursor->getId()); - static::assertEquals(1, $cursor->getFetches()); - - static::assertEquals(1001, $cursor->getCount()); - - $all = []; - while ($more = $cursor->getNextBatch()) { - $all = array_merge($all, $more); - } - static::assertEquals(2, $cursor->getFetches()); - static::assertCount(1001, $all); - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export some documents w/ multiple fetches - */ - public function testExportDocumentsMultipleFetches() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - $connection = $this->connection; - $statement = new Statement( - $connection, [ - 'query' => "FOR i IN 1..5000 INSERT { _key: CONCAT('test', i), value: i } IN " . $this->collection->getName() - ] - ); - $statement->execute(); - - $export = new Export($connection, $this->collection, []); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNotNull($cursor->getId()); - - static::assertEquals(5000, $cursor->getCount()); - $all = []; - while ($more = $cursor->getNextBatch()) { - $all = array_merge($all, $more); - } - static::assertEquals(5, $cursor->getFetches()); - static::assertCount(5000, $all); - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export some documents - */ - public function testExportDocumentsWithSmallBatchSize() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - $connection = $this->connection; - $statement = new Statement( - $connection, [ - 'query' => "FOR i IN 1..5000 INSERT { _key: CONCAT('test', i), value: i } IN " . $this->collection->getName() - ] - ); - $statement->execute(); - - $export = new Export($connection, $this->collection, ['batchSize' => 100]); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNotNull($cursor->getId()); - - static::assertEquals(5000, $cursor->getCount()); - $all = []; - while ($more = $cursor->getNextBatch()) { - $all = array_merge($all, $more); - } - static::assertEquals(50, $cursor->getFetches()); - static::assertCount(5000, $all); - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export as Document object - */ - public function testExportDocumentObjects() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - for ($i = 0; $i < 100; ++$i) { - $this->documentHandler->save($this->collection, ['value' => $i]); - } - - $export = new Export($this->connection, $this->collection, ['_flat' => false]); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNull($cursor->getId()); - - static::assertEquals(100, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - $all = $cursor->getNextBatch(); - static::assertCount(100, $all); - - foreach ($all as $doc) { - static::assertInstanceOf(Document::class, $doc); - } - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export as Edge object - */ - public function testExportEdgeObjects() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - - try { - $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestEdge' . '_' . static::$testsTimestamp); - } catch (\Exception $e) { - } - - $edgeCollection = new Collection(); - $edgeCollection->setName('ArangoDB_PHP_TestSuite_TestEdge' . '_' . static::$testsTimestamp); - $edgeCollection->setType(Collection::TYPE_EDGE); - $this->collectionHandler->create($edgeCollection); - - $edgeHandler = new EdgeHandler($this->connection); - - $vertexCollection = $this->collection->getName(); - - for ($i = 0; $i < 100; ++$i) { - $edgeHandler->saveEdge($edgeCollection, $vertexCollection . '/1', $vertexCollection . '/2', ['value' => $i]); - } - - $export = new Export($this->connection, $edgeCollection, ['_flat' => false]); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNull($cursor->getId()); - - static::assertEquals(100, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - $all = $cursor->getNextBatch(); - static::assertCount(100, $all); - - foreach ($all as $doc) { - static::assertInstanceOf(Document::class, $doc); - static::assertInstanceOf(Edge::class, $doc); - } - - static::assertFalse($cursor->getNextBatch()); - - $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestEdge' . '_' . static::$testsTimestamp); - } - - /** - * Test export as flat array - */ - public function testExportFlat() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - for ($i = 0; $i < 200; ++$i) { - $this->documentHandler->save($this->collection, ['value' => $i]); - } - - $export = new Export($this->connection, $this->collection, ['batchSize' => 50, '_flat' => true]); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNotNull($cursor->getId()); - - static::assertEquals(200, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - $all = []; - while ($more = $cursor->getNextBatch()) { - $all = array_merge($all, $more); - } - static::assertCount(200, $all); - - foreach ($all as $doc) { - static::assertNotInstanceOf(Document::class, $doc); - static::assertTrue(is_array($doc)); - } - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export with limit - */ - public function testExportLimit() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - for ($i = 0; $i < 200; ++$i) { - $this->documentHandler->save($this->collection, ['value' => $i]); - } - - $export = new Export( - $this->connection, $this->collection, [ - 'batchSize' => 50, - '_flat' => true, - 'limit' => 107 - ] - ); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNotNull($cursor->getId()); - - static::assertEquals(107, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - $all = []; - while ($more = $cursor->getNextBatch()) { - $all = array_merge($all, $more); - } - static::assertCount(107, $all); - - foreach ($all as $doc) { - static::assertNotInstanceOf(Document::class, $doc); - static::assertTrue(is_array($doc)); - } - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export with include restriction - */ - public function testExportRestrictInclude() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - for ($i = 0; $i < 200; ++$i) { - $this->documentHandler->save($this->collection, ['value1' => $i, 'value2' => 'test' . $i]); - } - - $export = new Export( - $this->connection, $this->collection, [ - 'batchSize' => 50, - '_flat' => true, - 'restrict' => ['type' => 'include', 'fields' => ['_key', 'value2']] - ] - ); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNotNull($cursor->getId()); - - static::assertEquals(200, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - $all = []; - while ($more = $cursor->getNextBatch()) { - $all = array_merge($all, $more); - } - static::assertCount(200, $all); - - foreach ($all as $doc) { - static::assertTrue(is_array($doc)); - static::assertCount(2, $doc); - static::assertFalse(isset($doc['_id'])); - static::assertTrue(isset($doc['_key'])); - static::assertFalse(isset($doc['_rev'])); - static::assertFalse(isset($doc['value1'])); - static::assertTrue(isset($doc['value2'])); - } - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export with include restriction - */ - public function testExportRestrictIncludeNonExisting() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - for ($i = 0; $i < 200; ++$i) { - $this->documentHandler->save($this->collection, ['value1' => $i, 'value2' => 'test' . $i]); - } - - $export = new Export( - $this->connection, $this->collection, [ - 'batchSize' => 50, - '_flat' => true, - 'restrict' => ['type' => 'include', 'fields' => ['foobar', 'baz']] - ] - ); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNotNull($cursor->getId()); - - static::assertEquals(200, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - $all = []; - while ($more = $cursor->getNextBatch()) { - $all = array_merge($all, $more); - } - static::assertCount(200, $all); - - foreach ($all as $doc) { - static::assertTrue(is_array($doc)); - static::assertEquals([], $doc); - } - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export with exclude restriction - */ - public function testExportRestrictExclude() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - for ($i = 0; $i < 200; ++$i) { - $this->documentHandler->save($this->collection, ['value1' => $i, 'value2' => 'test' . $i]); - } - - $export = new Export( - $this->connection, $this->collection, [ - 'batchSize' => 50, - '_flat' => true, - 'restrict' => ['type' => 'exclude', 'fields' => ['_key', 'value2']] - ] - ); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNotNull($cursor->getId()); - - static::assertEquals(200, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - $all = []; - while ($more = $cursor->getNextBatch()) { - $all = array_merge($all, $more); - } - static::assertCount(200, $all); - - foreach ($all as $doc) { - static::assertTrue(is_array($doc)); - static::assertCount(3, $doc); - static::assertFalse(isset($doc['_key'])); - static::assertTrue(isset($doc['_rev'])); - static::assertTrue(isset($doc['_id'])); - static::assertTrue(isset($doc['value1'])); - static::assertFalse(isset($doc['value2'])); - } - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export with non-existing fields restriction - */ - public function testExportRestrictExcludeNonExisting() - { - if (!$this->hasExportApi) { - $this->markTestSkipped("test is only meaningful with export API being present"); - } - for ($i = 0; $i < 200; ++$i) { - $this->documentHandler->save($this->collection, ['value1' => $i, 'value2' => 'test' . $i]); - } - - $export = new Export( - $this->connection, $this->collection, [ - 'batchSize' => 50, - '_flat' => true, - 'restrict' => ['type' => 'include', 'fields' => ['_id', 'foobar', 'baz']] - ] - ); - $cursor = $export->execute(); - - static::assertEquals(1, $cursor->getFetches()); - static::assertNotNull($cursor->getId()); - - static::assertEquals(200, $cursor->getCount()); - static::assertEquals(1, $cursor->getFetches()); - - $all = []; - while ($more = $cursor->getNextBatch()) { - $all = array_merge($all, $more); - } - static::assertCount(200, $all); - - foreach ($all as $doc) { - static::assertTrue(is_array($doc)); - static::assertCount(1, $doc); - static::assertTrue(isset($doc['_id'])); - static::assertFalse(isset($doc['foobar'])); - } - - static::assertFalse($cursor->getNextBatch()); - } - - /** - * Test export with invalid restriction definition - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testExportRestrictInvalidType() - { - if (!$this->hasExportApi) { - throw new ClientException('Invalid restrictions type definition'); - } - - $export = new Export( - $this->connection, $this->collection, [ - 'restrict' => ['type' => 'foo', 'fields' => ['_key']] - ] - ); - $export->execute(); - } - - /** - * Test export with invalid restriction definition - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testExportRestrictMissingType() - { - if (!$this->hasExportApi) { - throw new ClientException('Invalid restrictions type definition'); - } - - $export = new Export( - $this->connection, $this->collection, [ - 'restrict' => ['fields' => ['_key']] - ] - ); - $export->execute(); - } - - /** - * Test export with invalid restriction definition - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testExportRestrictInvalidFields() - { - if (!$this->hasExportApi) { - throw new ClientException('Invalid restrictions fields definition'); - } - - $export = new Export( - $this->connection, $this->collection, [ - 'restrict' => ['type' => 'include', 'fields' => 'foo'] - ] - ); - $export->execute(); - } - - /** - * Test export with invalid restriction definition - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testExportRestrictMissingFields() - { - if (!$this->hasExportApi) { - throw new ClientException('Invalid restrictions fields definition'); - } - - $export = new Export( - $this->connection, $this->collection, [ - 'restrict' => ['type' => 'include'] - ] - ); - $export->execute(); - } - - public function tearDown() - { - try { - $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection' . '_' . static::$testsTimestamp); - } catch (\Exception $e) { - // don't bother us, if it's already deleted. - } - - unset($this->documentHandler, $this->collectionHandler, $this->collection, $this->connection); - } - -} From 15de11aa9dc70dc3be9723d4216d50f4eefd5b12 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 20 Apr 2021 16:09:46 +0200 Subject: [PATCH 039/101] fix preview container id --- tests/travis/setup_arangodb.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index 8a57af44..2950ead8 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -36,7 +36,7 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $DIR docker pull arangodb/arangodb-preview:devel-nightly -docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:devel-nightly +docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:3.9.0-nightly sleep 2 From cb37246b1c34bebb7171e514a9a0c8ff8e110fe4 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 12:47:16 +0200 Subject: [PATCH 040/101] change cursor API from PUT to POST --- CHANGELOG.md | 4 ++++ lib/ArangoDBClient/Cursor.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d86a94df..1c1990df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ corresponding server-side APIs have been deprecated in ArangoDB 3.8: - class Export - class ExportCursor +The `Cursor` class will now fetch outstanding cursor result data via HTTP POST requests to +`/_api/cursor/`. It previously fetched further results via HTTP PUT requests from +the same address. The change is necessary because fetching further results is not an +idempotent operation, but the HTTP standard requires PUT operations to be idempotent. ## Release notes for the ArangoDB-PHP driver 3.7.x diff --git a/lib/ArangoDBClient/Cursor.php b/lib/ArangoDBClient/Cursor.php index 04fb1bd8..7e946ce1 100644 --- a/lib/ArangoDBClient/Cursor.php +++ b/lib/ArangoDBClient/Cursor.php @@ -690,7 +690,7 @@ private function sanitize(array $rows) private function fetchOutstanding() { // continuation - $response = $this->_connection->put($this->url() . '/' . $this->_id, '', []); + $response = $this->_connection->post($this->url() . '/' . $this->_id, '', []); ++$this->_fetches; $data = $response->getJson(); From 1d685b72412d2977a0368725b0ac805dbda3f77c Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 14:41:19 +0200 Subject: [PATCH 041/101] add more tests for document APIs --- CHANGELOG.md | 3 + lib/ArangoDBClient/Document.php | 2 +- lib/ArangoDBClient/DocumentHandler.php | 117 ++++++++++------- lib/ArangoDBClient/Handler.php | 15 +-- tests/CollectionBasicTest.php | 58 +++++++++ tests/DocumentBasicTest.php | 169 +++++++++++++++++++++++-- tests/DocumentExtendedTest.php | 158 ++++++++++++++++++++++- 7 files changed, 457 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c1990df..dbda76e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,9 @@ The `Cursor` class will now fetch outstanding cursor result data via HTTP POST r the same address. The change is necessary because fetching further results is not an idempotent operation, but the HTTP standard requires PUT operations to be idempotent. +Extended maximum valid length for collection names to 256, up from 64 before. This follows a +change in the ArangoDB server. + ## Release notes for the ArangoDB-PHP driver 3.7.x The corresponding ArangoDB version, ArangoDB 3.7 has dropped support for the MMFiles storage diff --git a/lib/ArangoDBClient/Document.php b/lib/ArangoDBClient/Document.php index f2fc58c1..095c057d 100644 --- a/lib/ArangoDBClient/Document.php +++ b/lib/ArangoDBClient/Document.php @@ -639,7 +639,7 @@ public function setInternalId($id) } - if (!preg_match('/^[a-zA-Z0-9_-]{1,64}\/' . self::KEY_REGEX_PART . '$/', $id)) { + if (!preg_match('/^[a-zA-Z0-9_-]{1,256}\/' . self::KEY_REGEX_PART . '$/', $id)) { throw new ClientException('Invalid format for document id'); } diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index dceb3b5f..5f18fd91 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -42,10 +42,15 @@ class DocumentHandler extends Handler const OPTION_EXAMPLE = 'example'; /** - * overwrite option + * overwrite option (deprecated) */ const OPTION_OVERWRITE = 'overwrite'; + /** + * overwriteMode option + */ + const OPTION_OVERWRITE_MODE = 'overwriteMode'; + /** * option for returning the old document */ @@ -55,6 +60,11 @@ class DocumentHandler extends Handler * option for returning the new document */ const OPTION_RETURN_NEW = 'returnNew'; + + /** + * silent option + */ + const OPTION_SILENT = 'silent'; /** @@ -331,9 +341,13 @@ public function store(Document $document, $collection = null, array $options = [ *

    Options are :
    *

  • 'createCollection' - create the collection if it does not yet exist.
  • *
  • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
  • - *
  • 'overwrite' - if set to true, will turn the insert into a replace operation if a document with the specified key already exists.
  • + *
  • 'keepNull' - can be used to instruct ArangoDB to delete existing attributes on update instead setting their values to null. Defaults to true (keep attributes when set to null). only useful with overwriteMode = update
  • + *
  • 'mergeObjects' - if true, updates to object attributes will merge the previous and the new objects. if false, replaces the object attribute with the new value. only useful with overwriteMode = update
  • + *
  • 'overwriteMode' - determines overwrite behavior in case a document with the same _key already exists. possible values: 'ignore', 'update', 'replace', 'conflict'.
  • + *
  • 'overwrite' - deprecated: if set to true, will turn the insert into a replace operation if a document with the specified key already exists.
  • *
  • 'returnNew' - if set to true, then the newly created document will be returned.
  • - *
  • 'returnOld' - if set to true, then the replaced document will be returned - useful only when using overwrite = true.
  • + *
  • 'returnOld' - if set to true, then the updated/replaced document will be returned - useful only when using overwriteMode = insert/update.
  • + *
  • 'silent' - whether or not to return information about the created document (e.g. _key and _rev).
  • *

    * * @return mixed - id of document created @@ -346,12 +360,17 @@ public function insert($collection, $document, array $options = []) $collection = $this->makeCollection($collection); $_documentClass = $this->_documentClass; + + if (!isset($options[self::OPTION_OVERWRITE_MODE]) && + isset($options[self::OPTION_OVERWRITE])) { + // map "overwrite" to "overwriteMode" + $options[self::OPTION_OVERWRITE_MODE] = $options[self::OPTION_OVERWRITE] ? 'replace' : 'conflict'; + unset($options[self::OPTION_OVERWRITE]); + } $params = $this->includeOptionsInParams( $options, [ - 'waitForSync' => null, - 'silent' => false, - 'overwrite' => (bool) @$options[self::OPTION_OVERWRITE], + 'waitForSync' => $this->getConnectionOption(ConnectionOptions::OPTION_WAIT_SYNC), 'returnOld' => (bool) @$options[self::OPTION_RETURN_OLD], 'returnNew' => (bool) @$options[self::OPTION_RETURN_NEW], ] @@ -380,8 +399,13 @@ public function insert($collection, $document, array $options = []) if ($batchPart = $response->getBatchPart()) { return $batchPart; } + + if (@$params[self::OPTION_SILENT]) { + // nothing will be returned here + return null; + } - if (@$options[self::OPTION_RETURN_OLD] || @$options[self::OPTION_RETURN_NEW]) { + if ($params[self::OPTION_RETURN_OLD] || $params[self::OPTION_RETURN_NEW]) { return $json; } @@ -438,7 +462,11 @@ public function save($collection, $document, array $options = []) *

    Options are : *

  • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • *
  • 'keepNull' - can be used to instruct ArangoDB to delete existing attributes instead setting their values to null. Defaults to true (keep attributes when set to null)
  • + *
  • 'mergeObjects' - if true, updates to object attributes will merge the previous and the new objects. if false, replaces the object attribute with the new value
  • *
  • 'waitForSync' - can be used to force synchronisation of the document update operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • + *
  • 'returnNew' - if set to true, then the updated document will be returned.
  • + *
  • 'returnOld' - if set to true, then the previous version of the document will be returned.
  • + *
  • 'silent' - whether or not to return information about the created document (e.g. _key and _rev).
  • *

    * * @return bool - always true, will throw if there is an error @@ -470,7 +498,11 @@ public function update(Document $document, array $options = []) *

    Options are : *

  • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • *
  • 'keepNull' - can be used to instruct ArangoDB to delete existing attributes instead setting their values to null. Defaults to true (keep attributes when set to null)
  • + *
  • 'mergeObjects' - if true, updates to object attributes will merge the previous and the new objects. if false, replaces the object attribute with the new value
  • *
  • 'waitForSync' - can be used to force synchronisation of the document update operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • + *
  • 'returnNew' - if set to true, then the updated document will be returned.
  • + *
  • 'returnOld' - if set to true, then the previous version of the document will be returned.
  • + *
  • 'silent' - whether or not to return information about the created document (e.g. _key and _rev).
  • *

    * * @return bool - always true, will throw if there is an error @@ -491,11 +523,6 @@ public function updateById($collection, $documentId, Document $document, array $ * @param mixed $documentId - document id as string or number * @param Document $document - patch document which contains the attributes and values to be updated * @param array $options - optional, array of options - *

    Options are : - *

  • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • - *
  • 'keepNull' - can be used to instruct ArangoDB to delete existing attributes instead setting their values to null. Defaults to true (keep attributes when set to null)
  • - *
  • 'waitForSync' - can be used to force synchronisation of the document update operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • - *

    * * @internal * @@ -512,8 +539,6 @@ protected function patch($url, $collection, $documentId, Document $document, arr $params = $this->includeOptionsInParams( $options, [ 'waitForSync' => $this->getConnectionOption(ConnectionOptions::OPTION_WAIT_SYNC), - 'keepNull' => true, - 'silent' => false, 'ignoreRevs' => true, 'policy' => $this->getConnectionOption(ConnectionOptions::OPTION_UPDATE_POLICY), 'returnOld' => (bool) @$options[self::OPTION_RETURN_OLD], @@ -537,6 +562,12 @@ protected function patch($url, $collection, $documentId, Document $document, arr $url = UrlHelper::appendParamsUrl($url, $params); $result = $this->getConnection()->patch($url, $this->json_encode_wrapper($document->getAllForInsertUpdate()), $headers); + + if (@$params[self::OPTION_SILENT]) { + // nothing will be returned here + return null; + } + $json = $result->getJson(); $document->setRevision($json[$_documentClass::ENTRY_REV]); @@ -566,6 +597,11 @@ protected function patch($url, $collection, $documentId, Document $document, arr *

    Options are : *

  • 'policy' - replace policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • *
  • 'waitForSync' - can be used to force synchronisation of the document update operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • + *
  • 'silent' - whether or not to return information about the replaced document (e.g. _key and _rev).
  • + *
  • 'ifMatch' - boolean if given revision should match or not
  • + *
  • 'revision' - The document is returned if it matches/not matches revision.
  • + *
  • 'returnNew' - if set to true, then the replaced document will be returned.
  • + *
  • 'returnOld' - if set to true, then the previous version of the document will be returned.
  • *

    * * @return bool - always true, will throw if there is an error @@ -596,6 +632,11 @@ public function replace(Document $document, array $options = []) *

    Options are : *

  • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • *
  • 'waitForSync' - can be used to force synchronisation of the document replacement operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • + *
  • 'silent' - whether or not to return information about the replaced document (e.g. _key and _rev).
  • + *
  • 'ifMatch' - boolean if given revision should match or not
  • + *
  • 'revision' - The document is returned if it matches/not matches revision.
  • + *
  • 'returnNew' - if set to true, then the replaced document will be returned.
  • + *
  • 'returnOld' - if set to true, then the previous version of the document will be returned.
  • *

    * * @return bool - always true, will throw if there is an error @@ -616,11 +657,6 @@ public function replaceById($collection, $documentId, Document $document, array * @param mixed $documentId - document id as string or number * @param Document $document - document to be updated * @param array $options - optional, array of options - *

    Options are : - *

  • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • - *
  • 'waitForSync' - can be used to force synchronisation of the document replacement operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • - *
  • 'ifMatch' - boolean if given revision should match or not
  • - *
  • 'revision' - The document is returned if it matches/not matches revision.
  • * * @internal * @@ -637,7 +673,6 @@ protected function put($url, $collection, $documentId, Document $document, array $params = $this->includeOptionsInParams( $options, [ 'waitForSync' => $this->getConnectionOption(ConnectionOptions::OPTION_WAIT_SYNC), - 'silent' => false, 'ignoreRevs' => true, 'policy' => $this->getConnectionOption(ConnectionOptions::OPTION_REPLACE_POLICY), 'returnOld' => (bool) @$options[self::OPTION_RETURN_OLD], @@ -659,6 +694,12 @@ protected function put($url, $collection, $documentId, Document $document, array $url = UrlHelper::buildUrl($url, [$collection, $documentId]); $url = UrlHelper::appendParamsUrl($url, $params); $result = $this->getConnection()->put($url, $this->json_encode_wrapper($data), $headers); + + if (@$params[self::OPTION_SILENT]) { + // nothing will be returned here + return null; + } + $json = $result->getJson(); $document->setRevision($json[$_documentClass::ENTRY_REV]); @@ -680,6 +721,10 @@ protected function put($url, $collection, $documentId, Document $document, array *

    Options are : *

  • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • *
  • 'waitForSync' - can be used to force synchronisation of the document removal operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • + *
  • 'silent' - whether or not to return information about the replaced document (e.g. _key and _rev).
  • + *
  • 'ifMatch' - boolean if given revision should match or not
  • + *
  • 'revision' - The document is returned if it matches/not matches revision.
  • + *
  • 'returnOld' - if set to true, then the previous version of the document will be returned.
  • *

    * * @return bool - always true, will throw if there is an error @@ -702,36 +747,15 @@ public function remove(Document $document, array $options = []) *

    Options are : *

  • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • *
  • 'waitForSync' - can be used to force synchronisation of the document removal operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • + *
  • 'silent' - whether or not to return information about the replaced document (e.g. _key and _rev).
  • + *
  • 'ifMatch' - boolean if given revision should match or not
  • + *
  • 'revision' - The document is returned if it matches/not matches revision.
  • + *
  • 'returnOld' - if set to true, then the previous version of the document will be returned.
  • *

    * * @return bool - always true, will throw if there is an error */ public function removeById($collection, $documentId, $revision = null, array $options = []) - { - return $this->erase(Urls::URL_DOCUMENT, $collection, $documentId, $revision, $options); - } - - - /** - * Remove a document from a collection (internal method) - * - * @throws Exception - * - * @param string $url - the server-side URL being called - * @param string $collection - collection id as string or number - * @param mixed $documentId - document id as string or number - * @param mixed $revision - optional revision of the document to be deleted - * @param array $options - optional, array of options - *

    Options are : - *

  • 'policy' - update policy to be used in case of conflict ('error', 'last' or NULL [use default])
  • - *
  • 'waitForSync' - can be used to force synchronisation of the document removal operation to disk even in case that the waitForSync flag had been disabled for the entire collection
  • - *

    - * - * @internal - * - * @return bool - always true, will throw if there is an error - */ - protected function erase($url, $collection, $documentId, $revision = null, array $options = []) { $headers = []; $this->addTransactionHeader($headers, $collection); @@ -741,7 +765,6 @@ protected function erase($url, $collection, $documentId, $revision = null, array $params = $this->includeOptionsInParams( $options, [ 'waitForSync' => $this->getConnectionOption(ConnectionOptions::OPTION_WAIT_SYNC), - 'silent' => false, 'ignoreRevs' => true, 'policy' => $this->getConnectionOption(ConnectionOptions::OPTION_DELETE_POLICY), 'returnOld' => (bool) @$options[self::OPTION_RETURN_OLD], @@ -758,7 +781,7 @@ protected function erase($url, $collection, $documentId, $revision = null, array } } - $url = UrlHelper::buildUrl($url, [$collection, $documentId]); + $url = UrlHelper::buildUrl(Urls::URL_DOCUMENT, [$collection, $documentId]); $url = UrlHelper::appendParamsUrl($url, $params); if (@$options[self::OPTION_RETURN_OLD]) { diff --git a/lib/ArangoDBClient/Handler.php b/lib/ArangoDBClient/Handler.php index ab5a8e22..15ee4488 100644 --- a/lib/ArangoDBClient/Handler.php +++ b/lib/ArangoDBClient/Handler.php @@ -100,19 +100,18 @@ protected function includeOptionsInParams($options, array $includeArray = []) { $params = []; foreach ($options as $key => $value) { - if (array_key_exists($key, $includeArray)) { - if ($key === ConnectionOptions::OPTION_UPDATE_POLICY) { - UpdatePolicy::validate($value); - } + if ($key === ConnectionOptions::OPTION_UPDATE_POLICY) { + UpdatePolicy::validate($value); + } + if ($value === null && isset($includeArray[$key])) { + $params[$key] = $includeArray[$key]; + } else { $params[$key] = $value; - if ($value === null) { - $params[$key] = $includeArray[$key]; - } } } foreach ($includeArray as $key => $value) { - if (!array_key_exists($key, $options)) { + if (!isset($options[$key])) { if ($key === ConnectionOptions::OPTION_UPDATE_POLICY) { UpdatePolicy::validate($value); } diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 48bd5d72..1576fd7e 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -87,6 +87,64 @@ public function testInitializeCollectionWithEdgeType() static::assertEquals(Collection::TYPE_EDGE, $collection->getType()); } + + /** + * Try to create a collection with a long name + */ + public function testCreateCollectionLongName() + { + $connection = $this->connection; + $collection = new Collection(); + $collectionHandler = new CollectionHandler($connection); + + $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp . '_00000000000000000028477732232578523444444444444444444444444444444444442323232'; + static::assertTrue(strlen($name) > 64); + + try { + $collectionHandler->drop($name); + } catch (Exception $e) { + //Silence the exception + } + + $collection->setName($name); + $response = $collectionHandler->create($collection); + + static::assertTrue(is_numeric($response), 'Did not return a numeric id!'); + + $resultingCollection = $collectionHandler->get($response); + + $resultingAttribute = $resultingCollection->getName(); + static::assertSame( + $name, $resultingAttribute, 'The created collection name and resulting collection name do not match!' + ); + + static::assertEquals(Collection::getDefaultType(), $resultingCollection->getType()); + + $collectionHandler->drop($collection); + } + + + /** + * Try to create a collection with a too long name + */ + public function testCreateCollectionTooLongName() + { + $connection = $this->connection; + $collection = new Collection(); + $collectionHandler = new CollectionHandler($connection); + + $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp . str_repeat('x', 256); + static::assertTrue(strlen($name) > 256); + + $collection->setName($name); + try { + $collectionHandler->create($collection); + } catch (Exception $exception400) { + //Silence the exception + } + + static::assertEquals(400, $exception400->getCode()); + } /** diff --git a/tests/DocumentBasicTest.php b/tests/DocumentBasicTest.php index dde3ef82..eb3d66c8 100644 --- a/tests/DocumentBasicTest.php +++ b/tests/DocumentBasicTest.php @@ -63,6 +63,44 @@ public function testInitializeDocument() } + /** + * Try to create a document silently + */ + public function testInsertSilent() + { + $connection = $this->connection; + $collection = $this->collection; + $document = Document::createFromArray(['_key' => 'me', 'value' => 1]); + $documentHandler = new DocumentHandler($connection); + + $document = $documentHandler->insert($collection->getName(), $document, ['silent' => true ]); + static::assertNull($document); + } + + + /** + * Try to create a document silently - with an error + */ + public function testInsertSilentWithError() + { + $connection = $this->connection; + $collection = $this->collection; + $document = Document::createFromArray(['_key' => 'me', 'value' => 1]); + $documentHandler = new DocumentHandler($connection); + + // insert the document once + $result = $documentHandler->insert($collection->getName(), $document, ['silent' => true ]); + static::assertNull($result); + + // and try to insert it again + try { + $documentHandler->insert($collection->getName(), $document, ['silent' => true ]); + } catch (\Exception $exception409) { + } + static::assertEquals(409, $exception409->getCode()); + } + + /** * Try to create a document and return it */ @@ -82,7 +120,7 @@ public function testInsertReturnNew() /** - * Try to create a document and overwrite it + * Try to create a document and overwrite it, using deprecated overwrite option */ public function testInsertOverwrite() { @@ -91,21 +129,36 @@ public function testInsertOverwrite() $document = Document::createFromArray(['_key' => 'me', 'value' => 1]); $documentHandler = new DocumentHandler($connection); - $document = $documentHandler->insert($collection->getName(), $document, ['returnNew' => true ]); + $document = $documentHandler->insert($collection->getName(), $document, ['returnNew' => true]); static::assertEquals('me', $document['_key']); static::assertEquals('me', $document['new']['_key']); static::assertEquals(1, $document['new']['value']); + try { + $documentHandler->insert($collection->getName(), $document, ['overwrite' => false]); + } catch (\Exception $exception409) { + } + static::assertEquals(409, $exception409->getCode()); + + $document = Document::createFromArray(['_key' => 'me', 'value' => 2]); + $document = $documentHandler->insert($collection->getName(), $document, ['overwrite' => true, 'returnOld' => true, 'returnNew' => true]); + static::assertEquals('me', $document['_key']); + static::assertEquals('me', $document['old']['_key']); + static::assertEquals('me', $document['new']['_key']); + static::assertEquals(1, $document['old']['value']); + static::assertEquals(2, $document['new']['value']); + + $document = Document::createFromArray(['_key' => 'other', 'value' => 2]); - $document = $documentHandler->insert($collection->getName(), $document, ['overwrite' => false, 'returnOld' => true, 'returnNew' => true ]); + $document = $documentHandler->insert($collection->getName(), $document, ['overwrite' => false, 'returnOld' => true, 'returnNew' => true]); static::assertEquals('other', $document['_key']); static::assertEquals('other', $document['new']['_key']); static::assertEquals(2, $document['new']['value']); $document = Document::createFromArray(['_key' => 'other', 'value' => 3]); - $document = $documentHandler->insert($collection->getName(), $document, ['overwrite' => true, 'returnOld' => true, 'returnNew' => true ]); + $document = $documentHandler->insert($collection->getName(), $document, ['overwrite' => true, 'returnOld' => true, 'returnNew' => true]); static::assertEquals('other', $document['_key']); static::assertEquals('other', $document['old']['_key']); @@ -114,12 +167,90 @@ public function testInsertOverwrite() static::assertEquals(3, $document['new']['value']); $document = Document::createFromArray(['_key' => 'foo', 'value' => 4]); - $document = $documentHandler->insert($collection->getName(), $document, ['overwrite' => true, 'returnOld' => true, 'returnNew' => true ]); + $document = $documentHandler->insert($collection->getName(), $document, ['overwrite' => true, 'returnOld' => true, 'returnNew' => true]); static::assertEquals('foo', $document['_key']); static::assertEquals('foo', $document['new']['_key']); static::assertEquals(4, $document['new']['value']); } + + /** + * Try to create a document and overwrite it, using overwriteMode option + */ + public function testInsertOverwriteMode() + { + $connection = $this->connection; + $collection = $this->collection; + $document = Document::createFromArray(['_key' => 'me', 'value' => 1]); + $documentHandler = new DocumentHandler($connection); + + $document = $documentHandler->insert($collection->getName(), $document, ['returnNew' => true]); + + static::assertEquals('me', $document['_key']); + static::assertEquals('me', $document['new']['_key']); + static::assertEquals(1, $document['new']['value']); + + // conflict mode + try { + $documentHandler->insert($collection->getName(), $document, ['overwriteMode' => 'conflict']); + } catch (\Exception $exception409) { + } + static::assertEquals(409, $exception409->getCode()); + + $document = Document::createFromArray(['_key' => 'other-no-conflict', 'value' => 1]); + $document = $documentHandler->insert($collection->getName(), $document, ['overwriteMode' => 'conflict']); + + static::assertEquals($collection->getName() . '/other-no-conflict', $document); + + + // ignore mode + $document = Document::createFromArray(['_key' => 'me', 'value' => 2]); + $document = $documentHandler->insert($collection->getName(), $document, ['overwriteMode' => 'ignore', 'returnOld' => true, 'returnNew' => true]); + + static::assertEquals('me', $document['_key']); + static::assertFalse(isset($document['_new'])); + static::assertFalse(isset($document['_old'])); + + + $document = Document::createFromArray(['_key' => 'yet-another', 'value' => 3]); + $document = $documentHandler->insert($collection->getName(), $document, ['overwriteMode' => 'ignore', 'returnOld' => true, 'returnNew' => true]); + + static::assertEquals('yet-another', $document['_key']); + static::assertEquals('yet-another', $document['new']['_key']); + static::assertEquals(3, $document['new']['value']); + static::assertFalse(isset($document['_old'])); + + + $document = Document::createFromArray(['_key' => 'yet-another', 'value' => 4]); + $document = $documentHandler->insert($collection->getName(), $document, ['overwriteMode' => 'ignore']); + + static::assertEquals($collection->getName() . '/yet-another', $document); + + + // update mode + $document = Document::createFromArray(['_key' => 'me', 'foo' => 'bar']); + $document = $documentHandler->insert($collection->getName(), $document, ['overwriteMode' => 'update', 'returnOld' => true, 'returnNew' => true ]); + + static::assertEquals('me', $document['_key']); + static::assertEquals('me', $document['old']['_key']); + static::assertEquals(1, $document['old']['value']); + static::assertEquals('me', $document['new']['_key']); + static::assertEquals(1, $document['new']['value']); + static::assertEquals('bar', $document['new']['foo']); + + + // replace mode + $document = Document::createFromArray(['_key' => 'me', 'qux' => 'qaz']); + $document = $documentHandler->insert($collection->getName(), $document, ['overwriteMode' => 'replace', 'returnOld' => true, 'returnNew' => true ]); + + static::assertEquals('me', $document['_key']); + static::assertEquals('me', $document['new']['_key']); + static::assertEquals(1, $document['old']['value']); + static::assertEquals('bar', $document['old']['foo']); + static::assertFalse(isset($document['new']['foo'])); + static::assertFalse(isset($document['new']['value'])); + static::assertEquals('qaz', $document['new']['qux']); + } /** @@ -142,7 +273,7 @@ public function testCreateAndDeleteDocumentWithId() $id = $resultingDocument->getHandle(); static::assertSame($collection->getName() . '/' . $key, $id); - $documentHandler->remove($document); + static::assertTrue($documentHandler->remove($document)); } @@ -165,7 +296,30 @@ public function testCreateAndDeleteDocument() $resultingAttribute = $resultingDocument->someAttribute; static::assertSame('someValue', $resultingAttribute, 'Resulting Attribute should be "someValue". It\'s :' . $resultingAttribute); - $documentHandler->remove($document); + static::assertTrue($documentHandler->remove($document)); + } + + + /** + * Try to create and silently delete a document + */ + public function testCreateAndDeleteDocumentSilent() + { + $connection = $this->connection; + $collection = $this->collection; + $document = new Document(); + $documentHandler = new DocumentHandler($connection); + + $document->someAttribute = 'someValue'; + + $documentId = $documentHandler->save($collection->getName(), $document); + + $resultingDocument = $documentHandler->get($collection->getName(), $documentId); + + $resultingAttribute = $resultingDocument->someAttribute; + static::assertSame('someValue', $resultingAttribute, 'Resulting Attribute should be "someValue". It\'s :' . $resultingAttribute); + + static::assertTrue($documentHandler->remove($document, ['silent' => true])); } @@ -231,7 +385,6 @@ public function testCreateAndDeleteDocumentWithoutCreatedCollectionAndOptionCrea } - /** * Try to create and delete a document using a defined key */ diff --git a/tests/DocumentExtendedTest.php b/tests/DocumentExtendedTest.php index 5c20ad85..810eec41 100644 --- a/tests/DocumentExtendedTest.php +++ b/tests/DocumentExtendedTest.php @@ -321,6 +321,66 @@ public function testUpdateDocumentWithWrongEncoding() $response = $documentHandler->remove($resultingDocument); static::assertTrue($response, 'Delete should return true!'); } + + /** + * test for updating a document using update() + */ + public function testUpdateDocumentMergeObjects() + { + $documentHandler = $this->documentHandler; + + $document = Document::createFromArray( + ['someAttribute' => ['foo' => 'bar', 'bark' => 'qux']] + ); + $documentId = $documentHandler->save($this->collection->getName(), $document); + @list(, $documentId) = explode('/', $documentId); + static::assertTrue(is_numeric($documentId), 'Did not return an id!'); + + $patchDocument = new Document(); + $patchDocument->set('_id', $document->getHandle()); + $patchDocument->set('_rev', $document->getRevision()); + $patchDocument->set('someAttribute', ['piff' => 'paff']); + $result = $documentHandler->update($patchDocument, ['mergeObjects' => true]); + + static::assertTrue($result); + + $resultingDocument = $documentHandler->get($this->collection->getName(), $documentId); + static::assertObjectHasAttribute('_id', $resultingDocument, '_id field should exist, empty or with an id'); + + static::assertEquals(['foo' => 'bar', 'bark' => 'qux', 'piff' => 'paff'], $resultingDocument->someAttribute); + $response = $documentHandler->remove($resultingDocument); + static::assertTrue($response, 'Delete should return true!'); + } + + /** + * test for updating a document using update() + */ + public function testUpdateDocumentDoNotMergeObjects() + { + $documentHandler = $this->documentHandler; + + $document = Document::createFromArray( + ['someAttribute' => ['foo' => 'bar', 'bark' => 'qux']] + ); + $documentId = $documentHandler->save($this->collection->getName(), $document); + @list(, $documentId) = explode('/', $documentId); + static::assertTrue(is_numeric($documentId), 'Did not return an id!'); + + $patchDocument = new Document(); + $patchDocument->set('_id', $document->getHandle()); + $patchDocument->set('_rev', $document->getRevision()); + $patchDocument->set('someAttribute', ['piff' => 'paff']); + $result = $documentHandler->update($patchDocument, ['mergeObjects' => false]); + + static::assertTrue($result); + + $resultingDocument = $documentHandler->get($this->collection->getName(), $documentId); + static::assertObjectHasAttribute('_id', $resultingDocument, '_id field should exist, empty or with an id'); + + static::assertEquals(['piff' => 'paff'], $resultingDocument->someAttribute); + $response = $documentHandler->remove($resultingDocument); + static::assertTrue($response, 'Delete should return true!'); + } /** @@ -384,6 +444,54 @@ public function testUpdateDocumentReturnOldNew() static::assertEquals(2, $result['new']['value']); static::assertNotEquals($result['old']['_rev'], $result['new']['_rev']); } + + + /** + * test for silently updating a document + */ + public function testUpdateDocumentSilent() + { + $documentHandler = $this->documentHandler; + + $document = Document::createFromArray( + ['_key' => 'test', 'value' => 1] + ); + $documentHandler->insert($this->collection->getName(), $document); + + $patchDocument = new Document(); + $patchDocument->set('_id', $document->getHandle()); + $patchDocument->set('value', 2); + $result = $documentHandler->update($patchDocument, ['silent' => true]); + static::assertNull($result); + + + $resultingDocument = $documentHandler->get($this->collection->getName(), 'test'); + static::assertEquals(2, $resultingDocument->value); + } + + + /** + * test for silently updating a document + */ + public function testUpdateDocumentSilentWithError() + { + $documentHandler = $this->documentHandler; + + $document = Document::createFromArray( + ['_key' => 'test', 'value' => 1] + ); + $documentHandler->insert($this->collection->getName(), $document); + + $patchDocument = Document::createFromArray( + ['_id' => $this->collection->getName() . '/test-does-not-exist'] + ); + + try { + $documentHandler->update($patchDocument, ['silent' => true]); + } catch (\Exception $exception404) { + } + static::assertEquals(404, $exception404->getCode()); + } /** @@ -488,6 +596,55 @@ public function testReplaceDocumentReturnOldNew() static::assertEquals(2, $result['new']['value']); static::assertNotEquals($result['old']['_rev'], $result['new']['_rev']); } + + + /** + * test for silently replacing a document + */ + public function testReplaceDocumentSilent() + { + $documentHandler = $this->documentHandler; + + $document = Document::createFromArray( + ['_key' => 'test', 'value' => 1] + ); + $documentHandler->insert($this->collection->getName(), $document); + + $patchDocument = new Document(); + $patchDocument->set('_id', $document->getHandle()); + $patchDocument->set('value', 2); + $result = $documentHandler->replace($patchDocument, ['silent' => true]); + static::assertNull($result); + + + $resultingDocument = $documentHandler->get($this->collection->getName(), 'test'); + static::assertEquals(2, $resultingDocument->value); + } + + + /** + * test for silently replacing a document + */ + public function testReplaceDocumentSilentWithError() + { + $documentHandler = $this->documentHandler; + + $document = Document::createFromArray( + ['_key' => 'test', 'value' => 1] + ); + $documentHandler->insert($this->collection->getName(), $document); + + $patchDocument = Document::createFromArray( + ['_id' => $this->collection->getName() . '/test-does-not-exist'] + ); + + try { + $documentHandler->replace($patchDocument, ['silent' => true]); + } catch (\Exception $exception404) { + } + static::assertEquals(404, $exception404->getCode()); + } + /** * test for deletion of a document with deleteById() not giving the revision @@ -540,7 +697,6 @@ public function testDeleteDocumentWithDeleteByIdWithRevisionAndPolicyIsError() try { $documentHandler->removeById($this->collection->getName(), $documentId, '_UOarUR----', ['policy' => 'error']); } catch (ServerException $e) { - static::assertTrue(true); } $response = $documentHandler->removeById($this->collection->getName(), $documentId, $revision, ['policy' => 'error']); From a03a73906b9f00c67db66dce3fce45d36d2f508a Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 14:49:28 +0200 Subject: [PATCH 042/101] deprecate some functionality --- CHANGELOG.md | 16 ++++++++++++++-- lib/ArangoDBClient/CollectionHandler.php | 8 ++++++-- lib/ArangoDBClient/Traversal.php | 1 + 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbda76e5..48f646e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,8 +14,15 @@ in a previous release and is not available in ArangoDB 3.9 anymore: In this version of the PHP driver the following classes are deprecated, because their corresponding server-side APIs have been deprecated in ArangoDB 3.8: -- class Export -- class ExportCursor +- class Export, class ExportCursor: use AQL streaming queries instead +- class Traversal: use AQL traversals instead +- class Batch, and issuing batch requests via them + +In addition, the following functionality is deprecated: + +- CollectionHandler::load() +- CollectionHandler::unload() +- The `Cursor` class will now fetch outstanding cursor result data via HTTP POST requests to `/_api/cursor/`. It previously fetched further results via HTTP PUT requests from @@ -25,6 +32,11 @@ idempotent operation, but the HTTP standard requires PUT operations to be idempo Extended maximum valid length for collection names to 256, up from 64 before. This follows a change in the ArangoDB server. +The driver now supports the following options for document CRUD operations: +- "overwriteMode" +- "silent" +- "keepNull", "mergeObjects" (for insert API if overwriteMode=update) + ## Release notes for the ArangoDB-PHP driver 3.7.x The corresponding ArangoDB version, ArangoDB 3.7 has dropped support for the MMFiles storage diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index 0794a70d..5b51c583 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -228,7 +228,7 @@ class CollectionHandler extends Handler const OPTION_FIGURES = 'figures'; /** - * load option + * load option (deprecated) */ const OPTION_LOAD = 'load'; @@ -341,7 +341,7 @@ public function create($collection, array $options = []) } /** - * unload option + * unload option (deprecated) */ const OPTION_UNLOAD = 'unload'; @@ -567,6 +567,8 @@ public function rename($collection, $name) * * @param mixed $collection - collection as string or object * + * @deprecated not necessary anymore + * * @return HttpResponse - HTTP response object */ public function load($collection) @@ -588,6 +590,8 @@ public function load($collection) * * @param mixed $collection - collection as string or object * + * @deprecated not necessary anymore + * * @return HttpResponse - HTTP response object */ public function unload($collection) diff --git a/lib/ArangoDBClient/Traversal.php b/lib/ArangoDBClient/Traversal.php index 545af584..888b4c6b 100644 --- a/lib/ArangoDBClient/Traversal.php +++ b/lib/ArangoDBClient/Traversal.php @@ -20,6 +20,7 @@ * * @link https://www.arangodb.com/docs/stable/http/traversal.html * + * @deprecated use AQL traversals instead * @package ArangoDBClient * @since 1.4 */ From 0cca679dc6349e9b1e73ba1e79d3465a0c85b6a3 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 18:31:01 +0200 Subject: [PATCH 043/101] added metrics API --- lib/ArangoDBClient/AdminHandler.php | 102 ++++++++++++++++++++++++++++ lib/ArangoDBClient/Urls.php | 13 ++-- tests/AdminTest.php | 29 ++++++++ 3 files changed, 140 insertions(+), 4 deletions(-) diff --git a/lib/ArangoDBClient/AdminHandler.php b/lib/ArangoDBClient/AdminHandler.php index c80ef3a3..1d86c991 100644 --- a/lib/ArangoDBClient/AdminHandler.php +++ b/lib/ArangoDBClient/AdminHandler.php @@ -159,6 +159,8 @@ public function getServerLog(array $options = []) * * @throws Exception * + * @deprecated not necessary anymore + * * @return bool * @since 1.2 */ @@ -168,6 +170,102 @@ public function reloadServerRouting() return true; } + + + /** + * Get the server metrics + * Returns the server metrics, as a structured array + * + * @link https://www.arangodb.com/docs/stable/http/administration-and-monitoring.html + * + * This will throw if the metrics cannot be retrieved + * + * @throws Exception + * + * @return array + * + * @since 3.8 + */ + public function getServerMetrics() + { + $url = UrlHelper::appendParamsUrl(Urls::URL_ADMIN_METRICS, []); + $response = $this->getConnection()->get($url); + + $metrics = []; + + foreach (explode("\n", $response->getBody()) as $line) { + if (trim($line) == "") { + continue; + } + if ($line[0] == "#") { + // type or help + if (!preg_match("/^#\s*([^\s]+)\s+([^\s]+)\s+(.*)$/", $line, $matches)) { + throw new ClientException('Invalid metrics API output line: "' . $line. '"'); + } + + $metric = $matches[2]; + if (!isset($metrics[$metric])) { + $metrics[$metric] = ["name" => $metric]; + } + + $metrics[$metric][strtolower($matches[1])] = $matches[3]; + } else { + // metric value + if (!preg_match("/^([^\s]+?)(\{.*?\})?\s+(.+)$\s*$/", $line, $matches)) { + throw new ClientException('Invalid metrics API output line: "' . $line. '"'); + } + + $metric = $matches[1]; + $sub = null; + if (preg_match("/_(sum|count|bucket)$/", $metric, $sub)) { + // sum, count, buckets + $metric = substr($metric, 0, -1 - strlen($sub[1])); + } + + if (!isset($metrics[$metric])) { + $metrics[$metric] = []; + } + + $le = null; + // labels + if ($matches[2] != "") { + $labels = substr($matches[2], 1, strlen($matches[2]) - 2); + foreach (explode(",", $labels) as $label) { + $parts = explode("=", $label); + $key = trim($parts[0]); + $value = trim($parts[1], " \""); + if (!isset($metrics[$metric]["labels"])) { + $metrics[$metric]["labels"] = []; + } + if ($key != "le") { + $metrics[$metric]["labels"][$key] = $value; + } else { + $le = $value; + } + } + } + + // cast to number + $value = $matches[3] + 0; + + if ($sub == null) { + // counter + $metrics[$metric]["value"] = $value; + } else if ($sub[1] == "bucket") { + // bucket value + if (!isset($metrics[$metric]["buckets"])) { + $metrics[$metric]["buckets"] = []; + } + $metrics[$metric]["buckets"][$le] = $value; + } else { + // sum, count + $metrics[$metric][$sub[1]] = $value; + } + } + } + + return $metrics; + } /** @@ -190,6 +288,8 @@ public function reloadServerRouting() * * @see getServerStatisticsDescription() * + * @deprecated use metrics API instead + * * @since 1.3 */ public function getServerStatistics() @@ -224,6 +324,8 @@ public function getServerStatistics() * * @see getServerStatistics() * + * @deprecated use metrics API instead + * * @since 1.3 */ public function getServerStatisticsDescription(array $options = []) diff --git a/lib/ArangoDBClient/Urls.php b/lib/ArangoDBClient/Urls.php index 0f7012e0..1b202797 100644 --- a/lib/ArangoDBClient/Urls.php +++ b/lib/ArangoDBClient/Urls.php @@ -194,22 +194,27 @@ abstract class Urls const URL_ADMIN_LOG = '/_admin/log'; /** - * base URL part for admin routing reload + * base URL part for admin routing reload (deprecated) */ const URL_ADMIN_ROUTING_RELOAD = '/_admin/routing/reload'; - + /** * base URL part for admin statistics */ + const URL_ADMIN_METRICS = '/_admin/metrics/v2'; + + /** + * base URL part for admin statistics (deprecated) + */ const URL_ADMIN_STATISTICS = '/_admin/statistics'; /** - * base URL part for admin statistics-description + * base URL part for admin statistics-description (deprecated) */ const URL_ADMIN_STATISTICS_DESCRIPTION = '/_admin/statistics-description'; /** - * base URL part for AQL user functions statistics + * base URL part for AQL user functions */ const URL_AQL_USER_FUNCTION = '/_api/aqlfunction'; diff --git a/tests/AdminTest.php b/tests/AdminTest.php index d2e8a4cc..775621f6 100644 --- a/tests/AdminTest.php +++ b/tests/AdminTest.php @@ -133,6 +133,35 @@ public function testGetServerLog() static::assertArrayHasKey('text', $result); static::assertArrayHasKey('totalAmount', $result); } + + + /** + * Test if we can get the server metrics + */ + public function testGetServerMetrics() + { + $result = $this->adminHandler->getServerMetrics(); + + static::assertTrue(count($result) > 50, "must have at least 50 metrics"); + + static::assertTrue(isset($result["arangodb_server_statistics_server_uptime_total"])); + $metric = $result["arangodb_server_statistics_server_uptime_total"]; + static::assertEquals("arangodb_server_statistics_server_uptime_total", $metric["name"]); + static::assertTrue(is_string($metric["help"])); + static::assertEquals("counter", $metric["type"]); + static::assertTrue(is_numeric($metric["value"])); + static::assertTrue($metric["value"] > 0); + + static::assertTrue(isset($result["arangodb_client_connection_statistics_connection_time"])); + $metric = $result["arangodb_client_connection_statistics_connection_time"]; + static::assertEquals("arangodb_client_connection_statistics_connection_time", $metric["name"]); + static::assertTrue(is_string($metric["help"])); + static::assertEquals("histogram", $metric["type"]); + static::assertFalse(isset($metric["value"])); + static::assertTrue(is_numeric($metric["count"])); + static::assertTrue(is_numeric($metric["sum"])); + static::assertTrue(is_array($metric["buckets"])); + } /** From 78714c2c6869a19e95e3e46eda6ab910c939b5b3 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 18:41:25 +0200 Subject: [PATCH 044/101] added test for memoryLimit --- tests/StatementTest.php | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/StatementTest.php b/tests/StatementTest.php index 716d2795..972a3e01 100644 --- a/tests/StatementTest.php +++ b/tests/StatementTest.php @@ -498,6 +498,42 @@ public function testTtl() static::assertTrue($excepted); } + public function testMemoryLimit() + { + $connection = $this->connection; + + $statement = new Statement( + $connection, [ + 'query' => 'RETURN NOOPT(FOR i IN 1..100000 RETURN CONCAT("testisiteisiitit", i))', + '_flat' => true + ] + ); + static::assertEquals(0, $statement->getMemoryLimit()); + + $cursor = $statement->execute(); + + $statement = new Statement( + $connection, [ + 'query' => 'RETURN NOOPT(FOR i IN 1..100000 RETURN CONCAT("testisiteisiitit", i))', + 'memoryLimit' => 32768, + '_flat' => true + ] + ); + + static::assertEquals(32768, $statement->getMemoryLimit()); + + $excepted = false; + try { + $statement->execute(); + } catch (ServerException $e) { + // resource limit exceeded = 32 + static::assertEquals(32, $e->getServerCode()); + $excepted = true; + } + + static::assertTrue($excepted); + } + public function testMaxRuntime() { $connection = $this->connection; From 3541a9e64624ab686cf36f4cf6785fd48bf5fbeb Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 19:18:05 +0200 Subject: [PATCH 045/101] schema support --- CHANGELOG.md | 9 +- lib/ArangoDBClient/Collection.php | 132 ++++++++--------------- lib/ArangoDBClient/CollectionHandler.php | 15 +-- tests/CollectionBasicTest.php | 36 ------- tests/CollectionExtendedTest.php | 100 +++++++++++------ tests/StreamingTransactionTest.php | 19 ---- tests/TransactionTest.php | 93 ---------------- 7 files changed, 124 insertions(+), 280 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48f646e9..196efb15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,6 @@ In addition, the following functionality is deprecated: - CollectionHandler::load() - CollectionHandler::unload() -- The `Cursor` class will now fetch outstanding cursor result data via HTTP POST requests to `/_api/cursor/`. It previously fetched further results via HTTP PUT requests from @@ -37,6 +36,14 @@ The driver now supports the following options for document CRUD operations: - "silent" - "keepNull", "mergeObjects" (for insert API if overwriteMode=update) +The following options have been removed in class Collection: +- isVolatile +- journalSize + +The following functions have been removed in class Collection: +- setJournalSize(), getJournalSize() +- setIsVolatile(), getIsVolatile() + ## Release notes for the ArangoDB-PHP driver 3.7.x The corresponding ArangoDB version, ArangoDB 3.7 has dropped support for the MMFiles storage diff --git a/lib/ArangoDBClient/Collection.php b/lib/ArangoDBClient/Collection.php index c7c484fb..70b64023 100644 --- a/lib/ArangoDBClient/Collection.php +++ b/lib/ArangoDBClient/Collection.php @@ -48,13 +48,6 @@ class Collection */ private $_waitForSync; - /** - * The collection journalSize value (might be NULL for new collections) - * - * @var int - journalSize value - */ - private $_journalSize; - /** * The collection isSystem value (might be NULL for new collections) * @@ -62,13 +55,6 @@ class Collection */ private $_isSystem; - /** - * The collection isVolatile value (might be NULL for new collections) - * - * @var bool - isVolatile value - */ - private $_isVolatile; - /** * The distributeShardsLike value (might be NULL for new collections) * @@ -131,6 +117,13 @@ class Collection * @var array - keyOptions value */ private $_keyOptions; + + /** + * The collection schema value + * + * @var mixed - schema + */ + private $_schema; /** * Collection id index @@ -152,11 +145,6 @@ class Collection */ const ENTRY_WAIT_SYNC = 'waitForSync'; - /** - * Collection 'journalSize' index - */ - const ENTRY_JOURNAL_SIZE = 'journalSize'; - /** * Collection 'status' index */ @@ -166,17 +154,17 @@ class Collection * Collection 'keyOptions' index */ const ENTRY_KEY_OPTIONS = 'keyOptions'; + + /** + * Collection 'schema' index + */ + const ENTRY_SCHEMA = 'schema'; /** * Collection 'isSystem' index */ const ENTRY_IS_SYSTEM = 'isSystem'; - /** - * Collection 'isVolatile' index - */ - const ENTRY_IS_VOLATILE = 'isVolatile'; - /** * Collection 'distributeShardsLike' index */ @@ -315,9 +303,7 @@ public function __clone() $this->_id = null; $this->_name = null; $this->_waitForSync = null; - $this->_journalSize = null; $this->_isSystem = null; - $this->_isVolatile = null; $this->_distributeShardsLike = null; $this->_numberOfShards = null; $this->_replicationFactor = null; @@ -325,6 +311,7 @@ public function __clone() $this->_shardingStrategy = null; $this->_shardKeys = null; $this->_smartJoinAttribute = null; + $this->_schema = null; } /** @@ -372,12 +359,11 @@ public function getAll() self::ENTRY_ID => $this->_id, self::ENTRY_NAME => $this->_name, self::ENTRY_WAIT_SYNC => $this->_waitForSync, - self::ENTRY_JOURNAL_SIZE => $this->_journalSize, self::ENTRY_IS_SYSTEM => $this->_isSystem, - self::ENTRY_IS_VOLATILE => $this->_isVolatile, self::ENTRY_TYPE => $this->_type, self::ENTRY_STATUS => $this->_status, - self::ENTRY_KEY_OPTIONS => $this->_keyOptions + self::ENTRY_KEY_OPTIONS => $this->_keyOptions, + self::ENTRY_SCHEMA => $this->_schema ]; if (null !== $this->_distributeShardsLike) { @@ -407,6 +393,8 @@ public function getAll() if (null !== $this->_smartJoinAttribute) { $result[self::ENTRY_SMART_JOIN_ATTRIBUTE] = $this->_smartJoinAttribute; } + + $result[self::ENTRY_SCHEMA] = $this->_schema; return $result; } @@ -447,21 +435,11 @@ public function set($key, $value) return; } - if ($key === self::ENTRY_JOURNAL_SIZE) { - $this->setJournalSize($value); - return; - } - if ($key === self::ENTRY_IS_SYSTEM) { $this->setIsSystem($value); return; } - if ($key === self::ENTRY_IS_VOLATILE) { - $this->setIsVolatile($value); - return; - } - if ($key === self::ENTRY_TYPE) { $this->setType($value); return; @@ -477,6 +455,11 @@ public function set($key, $value) return; } + if ($key === self::ENTRY_SCHEMA) { + $this->setSchema($value); + return; + } + if ($key === self::ENTRY_DISTRIBUTE_SHARDS_LIKE) { $this->setDistributeShardsLike($value); return; @@ -579,6 +562,31 @@ public function getName() return $this->_name; } + + /** + * Set the collection schema + * + * @param mixed $schema - schema + * + * @return void + */ + public function setSchema($schema) + { + assert(is_null($schema) || is_array($schema)); + + $this->_schema = $schema; + } + + /** + * Get the collection schema (if any) + * + * @return mixed - schema + */ + public function getSchema() + { + return $this->_schema; + } + /** * Set the collection type. * @@ -716,29 +724,6 @@ public function getWaitForSync() return $this->_waitForSync; } - /** - * Set the journalSize value - * - * @param int $value - journalSize value - * - * @return void - */ - public function setJournalSize($value) - { - assert(is_numeric($value)); - $this->_journalSize = $value; - } - - /** - * Get the journalSize value (if already known) - * - * @return int - journalSize value - */ - public function getJournalSize() - { - return $this->_journalSize; - } - /** * Set the isSystem value * @@ -762,29 +747,6 @@ public function getIsSystem() return $this->_isSystem; } - /** - * Set the isVolatile value - * - * @param bool $value - isVolatile value - * - * @return void - */ - public function setIsVolatile($value) - { - assert(null === $value || is_bool($value)); - $this->_isVolatile = $value; - } - - /** - * Get the isVolatile value (if already known) - * - * @return bool - isVolatile value - */ - public function getIsVolatile() - { - return $this->_isVolatile; - } - /** * Set the distribute shards like value * diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index 5b51c583..f0d4c0bd 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -246,9 +246,7 @@ class CollectionHandler extends Handler *

    Options are:
    *

  • 'type' - 2 -> normal collection, 3 -> edge-collection
  • *
  • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
  • - *
  • 'journalSize' - journalSize value.
  • *
  • 'isSystem' - false->user collection(default), true->system collection .
  • - *
  • 'isVolatile' - false->persistent collection(default), true->volatile (in-memory) collection .
  • *
  • 'keyOptions' - key options to use.
  • *
  • 'distributeShardsLike' - name of prototype collection for identical sharding.
  • *
  • 'numberOfShards' - number of shards for the collection.
  • @@ -257,6 +255,7 @@ class CollectionHandler extends Handler *
  • 'shardKeys' - array of shard key attributes.
  • *
  • 'shardingStrategy' - sharding strategy to use in cluster.
  • *
  • 'smartJoinAttribute' - attribute name for smart joins (if not shard key).
  • + *
  • 'schema' - collection schema.
  • *

    * * @return mixed - id of collection created @@ -275,27 +274,18 @@ public function create($collection, array $options = []) $collection->setWaitForSync($this->getConnectionOption(ConnectionOptions::OPTION_WAIT_SYNC)); } - if ($collection->getJournalSize() === null) { - $collection->setJournalSize($this->getConnectionOption(ConnectionOptions::OPTION_JOURNAL_SIZE)); - } - if ($collection->getIsSystem() === null) { $collection->setIsSystem($this->getConnectionOption(ConnectionOptions::OPTION_IS_SYSTEM)); } - if ($collection->getIsVolatile() === null) { - $collection->setIsVolatile($this->getConnectionOption(ConnectionOptions::OPTION_IS_VOLATILE)); - } - $type = $collection->getType() ?: Collection::getDefaultType(); $params = [ Collection::ENTRY_NAME => $collection->getName(), Collection::ENTRY_TYPE => $type, Collection::ENTRY_WAIT_SYNC => $collection->getWaitForSync(), - Collection::ENTRY_JOURNAL_SIZE => $collection->getJournalSize(), Collection::ENTRY_IS_SYSTEM => $collection->getIsSystem(), - Collection::ENTRY_IS_VOLATILE => $collection->getIsVolatile(), Collection::ENTRY_KEY_OPTIONS => $collection->getKeyOptions(), + Collection::ENTRY_SCHEMA => $collection->getSchema(), ]; // set extra cluster attributes @@ -327,6 +317,7 @@ public function create($collection, array $options = []) $params[Collection::ENTRY_SMART_JOIN_ATTRIBUTE] = $collection->getSmartJoinAttribute(); } + $response = $this->getConnection()->post(Urls::URL_COLLECTION, $this->json_encode_wrapper($params)); // $location = $response->getLocationHeader(); diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 1576fd7e..3f9851ee 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -39,7 +39,6 @@ public function setUp() $this->collectionHandler->create('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp); $adminHandler = new AdminHandler($this->connection); - $this->isMMFilesEngine = ($adminHandler->getEngine()["name"] == "mmfiles"); } @@ -750,41 +749,6 @@ public function testCreateAndDeleteEdgeCollectionWithoutCreatingObject() } - /** - * Try to create and delete an edge collection not using an edge object - */ - public function testCreateAndDeleteVolatileCollectionWithoutCreatingObject() - { - if (!$this->isMMFilesEngine) { - $this->markTestSkipped("test is only meaningful with the mmfiles engine"); - } - - $connection = $this->connection; - $collectionHandler = new CollectionHandler($connection); - - $name = 'ArangoDB_PHP_TestSuite_TestCollection_02' . '_' . static::$testsTimestamp; - - try { - $collectionHandler->drop($name); - } catch (Exception $e) { - //Silence the exception - } - - $options = ['isVolatile' => true]; - $collectionHandler->create($name, $options); - $resultingCollection = $collectionHandler->get($name); - - $resultingAttribute = $resultingCollection->getName(); - static::assertSame( - $name, $resultingAttribute, 'The created collection name and resulting collection name do not match!' - ); - $resultingCollectionProperties = $collectionHandler->getProperties($name); - static::assertTrue((!$this->isMMFilesEngine) || $resultingCollectionProperties->getIsVolatile()); - - $collectionHandler->drop($name); - } - - /** * Try to create and delete an edge collection not using an edge object */ diff --git a/tests/CollectionExtendedTest.php b/tests/CollectionExtendedTest.php index 7063562d..cb875b01 100644 --- a/tests/CollectionExtendedTest.php +++ b/tests/CollectionExtendedTest.php @@ -48,54 +48,101 @@ public function setUp() } $adminHandler = new AdminHandler($this->connection); - $this->isMMFilesEngine = ($adminHandler->getEngine()["name"] == "mmfiles"); } + + + /** + * test for creation with a schema + */ + public function testCreateWithNoSchema() + { + $collection = $this->collection; + $collectionHandler = $this->collectionHandler; + + $resultingAttribute = $collection->getSchema(); + static::assertNull($resultingAttribute, 'Default schema in collection should be NULL!'); + + $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; + $collection->setName($name); + $response = $collectionHandler->create($collection); + + static::assertTrue(is_numeric($response), 'Adding collection did not return an id!'); + + $properties = $collectionHandler->get($name); + static::assertNull($properties->getSchema()); + } + + /** - * test for creation, get, and delete of a collection with waitForSync default value (no setting) + * test for creation with schema */ - public function testCreateGetAndDeleteCollectionWithWaitForSyncDefault() + public function testCreateWithSchema() { $collection = $this->collection; $collectionHandler = $this->collectionHandler; - $resultingAttribute = $collection->getWaitForSync(); - static::assertNull($resultingAttribute, 'Default waitForSync in collection should be NULL!'); + $resultingAttribute = $collection->getSchema(); + static::assertNull($resultingAttribute, 'Default schema in collection should be NULL!'); $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; $collection->setName($name); + $schema = [ + "level" => "strict", + "rule" => [ + "type" => "object", + "properties" => [ + "numArray" => [ + "type" => "array", + "items" => [ + "type" => "number", + "maximum" => 6 + ] + ], + "name" => [ + "type" => "string", + "minLength" => 4, + "maxLength" => 10 + ], + "number" => [ + "type" => "number", + "items" => [ + "minimum" => 1000000 + ] + ] + ], + "additionalProperties" => false + ], + "message" => "Schema validation failed" + ]; + + $collection->setSchema($schema); + static::assertEquals($schema, $collection->getSchema()); $response = $collectionHandler->create($collection); static::assertTrue(is_numeric($response), 'Adding collection did not return an id!'); - $collectionHandler->get($name); - - $response = $collectionHandler->drop($collection); - static::assertTrue($response, 'Delete should return true!'); + $collectionWithSchema = $collectionHandler->getProperties($name); + static::assertEquals($schema, $collectionWithSchema->getSchema()); } /** - * test for creation, getProperties, and delete of a volatile (in-memory-only) collection + * test for creation, get, and delete of a collection with waitForSync default value (no setting) */ - public function testCreateGetAndDeleteVolatileCollection() + public function testCreateGetAndDeleteCollectionWithWaitForSyncDefault() { - if (!$this->isMMFilesEngine) { - $this->markTestSkipped("test is only meaningful with the mmfiles engine"); - } - $collection = $this->collection; $collectionHandler = $this->collectionHandler; - $resultingAttribute = $collection->getIsVolatile(); - static::assertNull($resultingAttribute, 'Default waitForSync in API should be NULL!'); + $resultingAttribute = $collection->getWaitForSync(); + static::assertNull($resultingAttribute, 'Default waitForSync in collection should be NULL!'); $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; $collection->setName($name); - $collection->setIsVolatile(true); $response = $collectionHandler->create($collection); @@ -104,10 +151,6 @@ public function testCreateGetAndDeleteVolatileCollection() $collectionHandler->get($name); - $properties = $collectionHandler->getProperties($name); - static::assertTrue((!$this->isMMFilesEngine) || $properties->getIsVolatile(), '"isVolatile" should be true!'); - - $response = $collectionHandler->drop($collection); static::assertTrue($response, 'Delete should return true!'); } @@ -367,18 +410,14 @@ public function testCreateRenameAndDeleteCollectionWithWrongEncoding() /** * test for creation, get, and delete of a collection with waitForSync set to true */ - public function testCreateGetAndDeleteCollectionWithWaitForSyncTrueAndJournalSizeSet() + public function testCreateGetAndDeleteCollectionWithWaitForSyncTrue() { $collection = $this->collection; $collectionHandler = $this->collectionHandler; $collection->setWaitForSync(true); - $collection->setJournalSize(1024 * 1024 * 2); $resultingWaitForSyncAttribute = $collection->getWaitForSync(); - $resultingJournalSizeAttribute = $collection->getJournalSize(); - static::assertTrue($resultingWaitForSyncAttribute, 'WaitForSync should be true!'); - static::assertEquals(1024 * 1024 * 2, $resultingJournalSizeAttribute, 'JournalSize should be 2MB!'); $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; $collection->setName($name); @@ -392,11 +431,6 @@ public function testCreateGetAndDeleteCollectionWithWaitForSyncTrueAndJournalSiz $properties, 'waiForSync field should exist, empty or with an id' ); - static::assertObjectHasAttribute( - '_journalSize', - $properties, - 'journalSize field should exist, empty or with an id' - ); // here we check the collectionHandler->unload() function // First fill it a bit to make sure it's loaded... @@ -439,9 +473,7 @@ public function testCreateGetAndDeleteCollectionWithWaitForSyncTrueAndJournalSiz $resultingWaitForSyncAttribute = $collection->getWaitForSync(); - $resultingJournalSizeAttribute = $collection->getJournalSize(); static::assertTrue($resultingWaitForSyncAttribute, 'Server waitForSync should return true!'); - static::assertEquals(1024 * 1024 * 2, $resultingJournalSizeAttribute, 'JournalSize should be 2MB!'); $response = $collectionHandler->drop($collection); static::assertTrue($response, 'Delete should return true!'); diff --git a/tests/StreamingTransactionTest.php b/tests/StreamingTransactionTest.php index 18a50ce7..060cd78a 100644 --- a/tests/StreamingTransactionTest.php +++ b/tests/StreamingTransactionTest.php @@ -65,7 +65,6 @@ public function setUp() $this->collectionHandler->create($this->collection2); $adminHandler = new AdminHandler($this->connection); - $this->isMMFilesEngine = ($adminHandler->getEngine()["name"] == "mmfiles"); $this->transactionHandler = new StreamingTransactionHandler($this->connection); } @@ -299,9 +298,6 @@ public function testGetCollection() public function testInsert() { - if ($this->isMMFilesEngine) { - $this->markTestSkipped("test is only meaningful with the rocksdb engine"); - } $trx = new StreamingTransaction($this->connection, [ TransactionBase::ENTRY_COLLECTIONS => [ TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] @@ -345,9 +341,6 @@ public function testInsert() public function testRemove() { - if ($this->isMMFilesEngine) { - $this->markTestSkipped("test is only meaningful with the rocksdb engine"); - } // insert a document before the transaction $documentHandler = new DocumentHandler($this->connection); $result = $documentHandler->save($this->collection1->getName(), [ '_key' => 'test', 'value' => 'test' ]); @@ -406,9 +399,6 @@ public function testRemove() public function testUpdate() { - if ($this->isMMFilesEngine) { - $this->markTestSkipped("test is only meaningful with the rocksdb engine"); - } // insert a document before the transaction $documentHandler = new DocumentHandler($this->connection); $result = $documentHandler->save($this->collection1->getName(), [ '_key' => 'test', 'value' => 'test' ]); @@ -459,9 +449,6 @@ public function testUpdate() public function testReplace() { - if ($this->isMMFilesEngine) { - $this->markTestSkipped("test is only meaningful with the rocksdb engine"); - } // insert a document before the transaction $documentHandler = new DocumentHandler($this->connection); $result = $documentHandler->save($this->collection1->getName(), [ '_key' => 'test', 'value' => 'test' ]); @@ -516,9 +503,6 @@ public function testReplace() public function testTruncate() { - if ($this->isMMFilesEngine) { - $this->markTestSkipped("test is only meaningful with the rocksdb engine"); - } $stmt = new Statement($this->connection, [ 'query' => 'FOR i IN 1..10 INSERT { _key: CONCAT("test", i), value: i } INTO @@collection', 'bindVars' => [ '@collection' => $this->collection1->getName() ] @@ -569,9 +553,6 @@ public function testTruncate() public function testQuery() { - if ($this->isMMFilesEngine) { - $this->markTestSkipped("test is only meaningful with the rocksdb engine"); - } $trx = new StreamingTransaction($this->connection, [ TransactionBase::ENTRY_COLLECTIONS => [ TransactionBase::ENTRY_WRITE => [ $this->collection1->getName() ] diff --git a/tests/TransactionTest.php b/tests/TransactionTest.php index 98a76950..5a98d666 100644 --- a/tests/TransactionTest.php +++ b/tests/TransactionTest.php @@ -60,101 +60,8 @@ public function setUp() $this->collectionHandler->create($this->collection2); $adminHandler = new AdminHandler($this->connection); - $this->isMMFilesEngine = ($adminHandler->getEngine()["name"] == "mmfiles"); } - /** - * Test if a deadlock occurs and error 29 is thrown - */ - public function testDeadlockHandling() - { - if (!$this->isMMFilesEngine || isCluster($this->connection)) { - $this->markTestSkipped("test is only meaningful with the mmfiles engine, single server"); - return; - } - - try { - $result = $this->connection->post('/_admin/execute', 'return 1'); - } catch (\Exception $e) { - // /_admin/execute API disabled on the server. must turn on - // --javascript.allow-admin-execute on the server for this to work - $this->markTestSkipped("need to start the server with --javascript.allow-admin-execute true to run this test"); - return; - } - - $w1 = [$this->collection1->getName()]; - $action1 = ' - try { - require("internal").db._executeTransaction({ collections: { write: [ "' . $this->collection2->getName() . '" ] }, action: function () { - require("internal").wait(7, false); - var db = require("internal").db; - db.' . $this->collection1->getName() . '.any(); - }}); - return { message: "ok" }; - } catch (err) { - return { message: err.errorNum }; - } - '; - - $result1 = $this->connection->post('/_admin/execute?returnAsJSON=true', $action1, ['X-Arango-Async' => 'store']); - $id1 = $result1->getHeader('x-arango-async-id'); - - $action2 = ' - try { - require("internal").db._executeTransaction({ collections: { write: [ "' . $this->collection1->getName() . '" ] }, action: function () { - require("internal").wait(7, false); - var db = require("internal").db; - db.' . $this->collection2->getName() . '.any(); - }}); - return { message: "ok" }; - } catch (err) { - return { message: err.errorNum }; - } - '; - - $result2 = $this->connection->post('/_admin/execute?returnAsJSON=true', $action2, ['X-Arango-Async' => 'store']); - $id2 = $result2->getHeader('x-arango-async-id'); - - $tries = 0; - $got1 = false; - $got2 = false; - $result1 = null; - $result2 = null; - while ($tries++ < 20) { - if (!$got1) { - try { - $result1 = $this->connection->put('/_api/job/' . $id1, ''); - if ($result1->getHeader('x-arango-async-id') !== null) { - $got1 = true; - } - } catch (Exception $e) { - } - } - if (!$got2) { - try { - $result2 = $this->connection->put('/_api/job/' . $id2, ''); - if ($result2->getHeader('x-arango-async-id') !== null) { - $got2 = true; - } - } catch (Exception $e) { - } - } - - if ($got1 && $got2) { - break; - } - - sleep(1); - } - - - static::assertTrue($got1); - static::assertTrue($got2); - - $r1 = json_decode($result1->getBody()); - $r2 = json_decode($result2->getBody()); - static::assertTrue($r1->message === 29 || $r2->message === 29); - } /** * Test if we can create and execute a transaction by using array initialization at construction time From 735d5cb52d4b65245bf3025bf84510981d93fa9f Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 19:32:33 +0200 Subject: [PATCH 046/101] more tests for indexes --- tests/CollectionExtendedTest.php | 159 +++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/tests/CollectionExtendedTest.php b/tests/CollectionExtendedTest.php index cb875b01..c77feb09 100644 --- a/tests/CollectionExtendedTest.php +++ b/tests/CollectionExtendedTest.php @@ -2575,6 +2575,165 @@ public function testCreateFulltextIndexedCollectionWithOptions() $response = $collectionHandler->drop($collection); static::assertTrue($response, 'Delete should return true!'); } + + + /** + * Test if we can create an array index + */ + public function testCreateArrayIndex() + { + // set up collections and index + $collectionHandler = $this->collectionHandler; + + $collection = Collection::createFromArray(['name' => 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp]); + $collectionHandler->create($collection); + + $indexRes = $collectionHandler->index( + $collection->getName(), + 'persistent', + ['names[*].first'], + ); + + static::assertArrayHasKey( + 'isNewlyCreated', + $indexRes, + 'index creation result should have the isNewlyCreated key !' + ); + + // Check if the index is returned in the indexes of the collection + $indexes = $collectionHandler->getIndexes($collection->getName()); + static::assertSame('names[*].first', $indexes['indexes'][1]['fields'][0]); + + // Drop the index + $collectionHandler->dropIndex($indexes['indexes'][1]['id']); + + // Clean up... + $response = $collectionHandler->drop($collection); + static::assertTrue($response, 'Delete should return true!'); + } + + + /** + * Test if we can create an array index with deduplicate option + */ + public function testCreateArrayIndexWithDeduplicateOption() + { + // set up collections and index + $collectionHandler = $this->collectionHandler; + + $collection = Collection::createFromArray(['name' => 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp]); + $collectionHandler->create($collection); + + $indexRes = $collectionHandler->index( + $collection->getName(), + 'persistent', + ['names[*].first'], + false, + ['deduplicate' => true] + ); + + static::assertArrayHasKey( + 'isNewlyCreated', + $indexRes, + 'index creation result should have the isNewlyCreated key !' + ); + + static::assertTrue($indexRes['deduplicate']); + + // Check if the index is returned in the indexes of the collection + $indexes = $collectionHandler->getIndexes($collection->getName()); + static::assertSame('names[*].first', $indexes['indexes'][1]['fields'][0]); + static::assertTrue($indexes['indexes'][1]['deduplicate']); + + // Drop the index + $collectionHandler->dropIndex($indexes['indexes'][1]['id']); + + // Clean up... + $response = $collectionHandler->drop($collection); + static::assertTrue($response, 'Delete should return true!'); + } + + + /** + * Test if we can create an array index with deduplicate option + */ + public function testCreateIndexWithDisabledEstimates() + { + // set up collections and index + $collectionHandler = $this->collectionHandler; + + $collection = Collection::createFromArray(['name' => 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp]); + $collectionHandler->create($collection); + + $indexRes = $collectionHandler->index( + $collection->getName(), + 'persistent', + ['value'], + false, + ['estimates' => false] + ); + + static::assertArrayHasKey( + 'isNewlyCreated', + $indexRes, + 'index creation result should have the isNewlyCreated key !' + ); + + static::assertFalse($indexRes['estimates']); + + // Check if the index is returned in the indexes of the collection + $indexes = $collectionHandler->getIndexes($collection->getName()); + static::assertSame('value', $indexes['indexes'][1]['fields'][0]); + static::assertFalse($indexes['indexes'][1]['estimates']); + + // Drop the index + $collectionHandler->dropIndex($indexes['indexes'][1]['id']); + + // Clean up... + $response = $collectionHandler->drop($collection); + static::assertTrue($response, 'Delete should return true!'); + } + + /** + * Test if we can create a ttl index + */ + public function testCreateTtlIndex() + { + // set up collections and index + $collectionHandler = $this->collectionHandler; + + $collection = Collection::createFromArray(['name' => 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp]); + $collectionHandler->create($collection); + + $indexRes = $collectionHandler->index( + $collection->getName(), + 'ttl', + ['expiresAt'], + false, + ['expireAfter' => 10000] + ); + + static::assertArrayHasKey( + 'isNewlyCreated', + $indexRes, + 'index creation result should have the isNewlyCreated key !' + ); + + static::assertArrayHasKey('expireAfter', $indexRes); + static::assertEquals(10000, $indexRes['expireAfter']); + + // Check if the index is returned in the indexes of the collection + $indexes = $collectionHandler->getIndexes($collection->getName()); + static::assertSame('expiresAt', $indexes['indexes'][1]['fields'][0]); + static::assertSame(10000, $indexes['indexes'][1]['expireAfter']); + + // Drop the index + $collectionHandler->dropIndex($indexes['indexes'][1]['id']); + + // Clean up... + $response = $collectionHandler->drop($collection); + static::assertTrue($response, 'Delete should return true!'); + } /** From f40a7137481b4c124a946fab19c512756e991f18 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 19:48:01 +0200 Subject: [PATCH 047/101] added engine stats --- lib/ArangoDBClient/AdminHandler.php | 18 +++++++++++++++++- lib/ArangoDBClient/Urls.php | 5 +++++ tests/AdminTest.php | 24 ++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/lib/ArangoDBClient/AdminHandler.php b/lib/ArangoDBClient/AdminHandler.php index 1d86c991..8637a60b 100644 --- a/lib/ArangoDBClient/AdminHandler.php +++ b/lib/ArangoDBClient/AdminHandler.php @@ -29,7 +29,7 @@ class AdminHandler extends Handler const OPTION_DETAILS = 'details'; /** - * Get the server's storage engine + * Get the server's storage engine * * This will throw if the engine data cannot be retrieved * @@ -43,6 +43,22 @@ public function getEngine() $response = $this->getConnection()->get(Urls::URL_ENGINE); return $response->getJson(); } + + /** + * Get the server's storage engine statistics + * + * This will throw if the engine data cannot be retrieved + * + * @throws Exception + * + * @return mixed - an object returning the engine statistics + * @since 3.8 + */ + public function getEngineStats() + { + $response = $this->getConnection()->get(Urls::URL_ENGINE_STATS); + return $response->getJson(); + } /** * Get the server version diff --git a/lib/ArangoDBClient/Urls.php b/lib/ArangoDBClient/Urls.php index 1b202797..8bafb600 100644 --- a/lib/ArangoDBClient/Urls.php +++ b/lib/ArangoDBClient/Urls.php @@ -172,6 +172,11 @@ abstract class Urls * URL for storage engine */ const URL_ENGINE = '/_api/engine'; + + /** + * URL for storage engine stats + */ + const URL_ENGINE_STATS = '/_api/engine/stats'; /** * URL for admin version diff --git a/tests/AdminTest.php b/tests/AdminTest.php index 775621f6..00733818 100644 --- a/tests/AdminTest.php +++ b/tests/AdminTest.php @@ -21,6 +21,30 @@ public function setUp() $this->connection = getConnection(); $this->adminHandler = new AdminHandler($this->connection); } + + + /** + * Test if we can get the storage engine + */ + public function testEngine() + { + $result = $this->adminHandler->getEngine(); + static::assertEquals("rocksdb", $result["name"]); + static::assertTrue(isset($result["supports"])); + } + + + /** + * Test if we can get the storage engine statistics + */ + public function testEngineStats() + { + $result = $this->adminHandler->getEngineStats(); + static::assertTrue(is_array($result)); + static::assertTrue(isset($result["cache.limit"])); + static::assertTrue(isset($result["cache.allocated"])); + static::assertTrue(isset($result["columnFamilies"])); + } /** From 8992f6c629620c264ed1166bc0c894df2d0bcd28 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 19:58:13 +0200 Subject: [PATCH 048/101] admin/log/entries --- CHANGELOG.md | 36 ++++++++++++++++---------- lib/ArangoDBClient/AdminHandler.php | 39 +++++++++++++++++++++++++++++ lib/ArangoDBClient/Collection.php | 4 +-- lib/ArangoDBClient/Urls.php | 7 +++++- tests/AdminTest.php | 19 ++++++++++++++ 5 files changed, 89 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 196efb15..ff350dc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,27 @@ in a previous release and is not available in ArangoDB 3.9 anymore: ## Release notes for the ArangoDB-PHP driver 3.8.x +The driver now supports the following options for document CRUD operations: +- "overwriteMode" +- "silent" +- "keepNull", "mergeObjects" (for insert API if overwriteMode=update) + +Extended maximum valid length for collection names to 256, up from 64 before. This follows a +change in the ArangoDB server. + +Indexes can now be created with "deduplicate" and "estimates" attribute set/not set. + +The engine stats API is now supported via `AdminHandler::getEngineStats()`. + +The metrics API is now supported via `AdminHandler::getMetrics()`. + +Collection objects now support schemas via the `getSchema()`, `setSchema()` methods. + +The `Cursor` class will now fetch outstanding cursor result data via HTTP POST requests to +`/_api/cursor/`. It previously fetched further results via HTTP PUT requests from +the same address. The change is necessary because fetching further results is not an +idempotent operation, but the HTTP standard requires PUT operations to be idempotent. + In this version of the PHP driver the following classes are deprecated, because their corresponding server-side APIs have been deprecated in ArangoDB 3.8: @@ -22,19 +43,8 @@ In addition, the following functionality is deprecated: - CollectionHandler::load() - CollectionHandler::unload() - -The `Cursor` class will now fetch outstanding cursor result data via HTTP POST requests to -`/_api/cursor/`. It previously fetched further results via HTTP PUT requests from -the same address. The change is necessary because fetching further results is not an -idempotent operation, but the HTTP standard requires PUT operations to be idempotent. - -Extended maximum valid length for collection names to 256, up from 64 before. This follows a -change in the ArangoDB server. - -The driver now supports the following options for document CRUD operations: -- "overwriteMode" -- "silent" -- "keepNull", "mergeObjects" (for insert API if overwriteMode=update) +- AdminHandler::getServerStatistics() +- AdminHandler::getServerStatisticsDescription() The following options have been removed in class Collection: - isVolatile diff --git a/lib/ArangoDBClient/AdminHandler.php b/lib/ArangoDBClient/AdminHandler.php index 8637a60b..5383b481 100644 --- a/lib/ArangoDBClient/AdminHandler.php +++ b/lib/ArangoDBClient/AdminHandler.php @@ -127,6 +127,44 @@ public function getServerTime() return $data['time']; } + + + /** + * Get the server log entries + * + * This will throw if the log cannot be retrieved + * + * @throws Exception + * + * @param array $options - an array of options that define the result-set: + * + *

    Options are :
    + *

  • 'upto' - returns all log entries up to a log-level. Note that log-level must be one of:
  • + *

    + *

  • fatal / 0
  • + *
  • error / 1
  • + *
  • warning / 2
  • + *
  • info / 3
  • + *
  • debug / 4
  • + *

    + *
  • 'level' - limits the log entries to the ones defined in level. Note that `level` and `upto` are mutably exclusive.
  • + *
  • 'offset' - skip the first offset entries.
  • + *
  • 'size' - limit the number of returned log-entries to size.
  • + *
  • 'start' - Returns all log entries such that their log-entry identifier is greater or equal to lid.
  • + *
  • 'sort' - Sort the log-entries either ascending if direction is asc, or descending if it is desc according to their lid. Note that the lid imposes a chronological order.
  • + *
  • 'search' - Only return the log-entries containing the text string...
  • + *

    + * + * @return array - an array holding the various attributes of a log: lid, level, timestamp, text and the total amount of log entries before pagination. + * @since 1.2 + */ + public function getServerLogEntries(array $options = []) + { + $url = UrlHelper::appendParamsUrl(Urls::URL_ADMIN_LOG_ENTRIES, $options); + $response = $this->getConnection()->get($url); + + return $response->getJson(); + } /** @@ -154,6 +192,7 @@ public function getServerTime() *
  • 'sort' - Sort the log-entries either ascending if direction is asc, or descending if it is desc according to their lid. Note that the lid imposes a chronological order.
  • *
  • 'search' - Only return the log-entries containing the text string...
  • *

    + * @deprecated use getServerLogEntries() instead * * @return array - an array holding the various attributes of a log: lid, level, timestamp, text and the total amount of log entries before pagination. * @since 1.2 diff --git a/lib/ArangoDBClient/Collection.php b/lib/ArangoDBClient/Collection.php index 70b64023..3872cb60 100644 --- a/lib/ArangoDBClient/Collection.php +++ b/lib/ArangoDBClient/Collection.php @@ -834,7 +834,7 @@ public function setWriteConcern($value) * * @param int $value - write concern value * - * @deprecated use setWriteConcern instead + * @deprecated use setWriteConcern() instead * @return void */ public function setMinReplicationFactor($value) @@ -855,7 +855,7 @@ public function getWriteConcern() /** * Get the write concern value (if already known). this is an alias only * - * @deprecated use getWriteConcern instead + * @deprecated use getWriteConcern() instead * @return mixed - write concern value */ public function getMinReplicationFactor() diff --git a/lib/ArangoDBClient/Urls.php b/lib/ArangoDBClient/Urls.php index 8bafb600..024764ef 100644 --- a/lib/ArangoDBClient/Urls.php +++ b/lib/ArangoDBClient/Urls.php @@ -194,9 +194,14 @@ abstract class Urls const URL_ADMIN_TIME = '/_admin/time'; /** - * URL for admin log + * URL for admin log (deprecated) */ const URL_ADMIN_LOG = '/_admin/log'; + + /** + * URL for admin log entries + */ + const URL_ADMIN_LOG_ENTRIES = '/_admin/log/entries'; /** * base URL part for admin routing reload (deprecated) diff --git a/tests/AdminTest.php b/tests/AdminTest.php index 00733818..52a33729 100644 --- a/tests/AdminTest.php +++ b/tests/AdminTest.php @@ -87,6 +87,25 @@ public function testGetServerTime() $result = $this->adminHandler->getServerTime(); static::assertTrue(is_float($result), 'Time must be a double (float)!'); } + + + /** + * Test if we can get the server log + * Rather dumb tests just checking that an array is returned + */ + public function testGetServerLogEntries() + { + $result = $this->adminHandler->getServerLogEntries(); + static::assertTrue(is_array($result), 'Should be an array'); + + foreach ($result as $entry) { + static::assertArrayHasKey('id', $entry); + static::assertArrayHasKey('topc', $entry); + static::assertArrayHasKey('level', $entry); + static::assertArrayHasKey('date', $entry); + static::assertArrayHasKey('message', $entry); + } + } /** From 0b8107b04cdf4fb17492cb4c5846181876d49ae4 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 20:27:09 +0200 Subject: [PATCH 049/101] add JWT support --- CHANGELOG.md | 12 +++++++++++ lib/ArangoDBClient/Connection.php | 26 +++++++++++++++++++----- lib/ArangoDBClient/ConnectionOptions.php | 14 +------------ lib/ArangoDBClient/DefaultValues.php | 10 --------- 4 files changed, 34 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff350dc0..43d65556 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,18 @@ in a previous release and is not available in ArangoDB 3.9 anymore: ## Release notes for the ArangoDB-PHP driver 3.8.x +The driver now supports connecting via JWT if the server's JWT secret is known. +In order to use a JWT to connect, set the following value in ConnectionOptions: +``` +$connectionOptions = [ + ArangoDBClient\ConnectionOptions::OPTION_DATABASE => '_system', // database name + ArangoDBClient\ConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529', // endpoint to connect to + ArangoDBClient\ConnectionOptions::OPTION_AUTH_TYPE => 'Bearer', // authentication via JWT! + ArangoDBClient\ConnectionOptions::OPTION_AUTH_USER => 'root', // user name + ArangoDBClient\ConnectionOptions::OPTION_AUTH_PASSWD => 'jwt-secret-value', // server's JWT secret value, + ]; +``` + The driver now supports the following options for document CRUD operations: - "overwriteMode" - "silent" diff --git a/lib/ArangoDBClient/Connection.php b/lib/ArangoDBClient/Connection.php index 5478a324..0910f1de 100644 --- a/lib/ArangoDBClient/Connection.php +++ b/lib/ArangoDBClient/Connection.php @@ -425,12 +425,28 @@ private function updateHttpHeader() } if (isset($this->_options[ConnectionOptions::OPTION_AUTH_TYPE], $this->_options[ConnectionOptions::OPTION_AUTH_USER])) { - // add authorization header - $authorizationValue = base64_encode( - $this->_options[ConnectionOptions::OPTION_AUTH_USER] . ':' . - $this->_options[ConnectionOptions::OPTION_AUTH_PASSWD] - ); + if ($this->_options[ConnectionOptions::OPTION_AUTH_TYPE] == 'Bearer') { + // JWT + $base = json_encode(['typ' => 'JWT', 'alg' => 'HS256']); + $base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($base)); + $payload = json_encode([ + 'preferred_username' => $this->_options[ConnectionOptions::OPTION_AUTH_USER], + 'iss' => 'arangodb', + 'iat' => (int) microtime(true), + ]); + $base64UrlPayload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload)); + $signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $this->_options[ConnectionOptions::OPTION_AUTH_PASSWD], true); + $base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature)); + $authorizationValue = $base64UrlHeader . '.' . $base64UrlPayload . '.' . $base64UrlSignature; + } else { + // HTTP basic authentication + $authorizationValue = base64_encode( + $this->_options[ConnectionOptions::OPTION_AUTH_USER] . ':' . + $this->_options[ConnectionOptions::OPTION_AUTH_PASSWD] + ); + } + // add authorization header $this->_httpHeader .= sprintf( 'Authorization: %s %s%s', $this->_options[ConnectionOptions::OPTION_AUTH_TYPE], diff --git a/lib/ArangoDBClient/ConnectionOptions.php b/lib/ArangoDBClient/ConnectionOptions.php index f68dd1df..679a72d6 100644 --- a/lib/ArangoDBClient/ConnectionOptions.php +++ b/lib/ArangoDBClient/ConnectionOptions.php @@ -165,21 +165,11 @@ class ConnectionOptions implements \ArrayAccess */ const OPTION_BATCHSIZE = 'batchSize'; - /** - * Wait for sync index constant - */ - const OPTION_JOURNAL_SIZE = 'journalSize'; - /** * Wait for sync index constant */ const OPTION_IS_SYSTEM = 'isSystem'; - /** - * Wait for sync index constant - */ - const OPTION_IS_VOLATILE = 'isVolatile'; - /** * Authentication user name */ @@ -456,9 +446,7 @@ private static function getDefaults() self::OPTION_REVISION => null, self::OPTION_WAIT_SYNC => DefaultValues::DEFAULT_WAIT_SYNC, self::OPTION_BATCHSIZE => null, - self::OPTION_JOURNAL_SIZE => DefaultValues::DEFAULT_JOURNAL_SIZE, self::OPTION_IS_SYSTEM => false, - self::OPTION_IS_VOLATILE => DefaultValues::DEFAULT_IS_VOLATILE, self::OPTION_CONNECTION => DefaultValues::DEFAULT_CONNECTION, self::OPTION_TRACE => null, self::OPTION_ENHANCED_TRACE => false, @@ -486,7 +474,7 @@ private static function getDefaults() */ private static function getSupportedAuthTypes() { - return ['Basic']; + return ['Basic', 'Bearer']; } /** diff --git a/lib/ArangoDBClient/DefaultValues.php b/lib/ArangoDBClient/DefaultValues.php index b01d62f0..84b34dde 100644 --- a/lib/ArangoDBClient/DefaultValues.php +++ b/lib/ArangoDBClient/DefaultValues.php @@ -51,16 +51,6 @@ abstract class DefaultValues */ const DEFAULT_WAIT_SYNC = false; - /** - * Default value for collection journal size - */ - const DEFAULT_JOURNAL_SIZE = 33554432; - - /** - * Default value for isVolatile - */ - const DEFAULT_IS_VOLATILE = false; - /** * Default value for createCollection (create the collection on the fly when the first document is added to an unknown collection) */ From 530d5d262fdcfc74f54aee8b80f7760011ceb4ef Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 20:37:10 +0200 Subject: [PATCH 050/101] fix a test --- tests/AdminTest.php | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tests/AdminTest.php b/tests/AdminTest.php index 52a33729..32fa5ad8 100644 --- a/tests/AdminTest.php +++ b/tests/AdminTest.php @@ -41,9 +41,18 @@ public function testEngineStats() { $result = $this->adminHandler->getEngineStats(); static::assertTrue(is_array($result)); - static::assertTrue(isset($result["cache.limit"])); - static::assertTrue(isset($result["cache.allocated"])); - static::assertTrue(isset($result["columnFamilies"])); + + if (isCluster($this->connection)) { + foreach ($result as $server => $entry) { + static::assertTrue(isset($entry["cache.limit"])); + static::assertTrue(isset($entry["cache.allocated"])); + static::assertTrue(isset($entry["columnFamilies"])); + } + } else { + static::assertTrue(isset($result["cache.limit"])); + static::assertTrue(isset($result["cache.allocated"])); + static::assertTrue(isset($result["columnFamilies"])); + } } @@ -96,11 +105,11 @@ public function testGetServerTime() public function testGetServerLogEntries() { $result = $this->adminHandler->getServerLogEntries(); - static::assertTrue(is_array($result), 'Should be an array'); + static::assertTrue(is_array($result['messages']), 'Should be an array'); - foreach ($result as $entry) { + foreach ($result['messages'] as $entry) { static::assertArrayHasKey('id', $entry); - static::assertArrayHasKey('topc', $entry); + static::assertArrayHasKey('topic', $entry); static::assertArrayHasKey('level', $entry); static::assertArrayHasKey('date', $entry); static::assertArrayHasKey('message', $entry); From 9507ec77da1a0f3990489c0ebebd488ec1abe6b8 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 22 Apr 2021 20:50:56 +0200 Subject: [PATCH 051/101] remove trailing comma --- tests/CollectionExtendedTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CollectionExtendedTest.php b/tests/CollectionExtendedTest.php index c77feb09..76455bbb 100644 --- a/tests/CollectionExtendedTest.php +++ b/tests/CollectionExtendedTest.php @@ -2591,7 +2591,7 @@ public function testCreateArrayIndex() $indexRes = $collectionHandler->index( $collection->getName(), 'persistent', - ['names[*].first'], + ['names[*].first'] ); static::assertArrayHasKey( From 670bfce990138f064b54812b9b0ed6f668e97fb4 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 23 Apr 2021 14:36:29 +0200 Subject: [PATCH 052/101] added test --- tests/DocumentBasicTest.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/DocumentBasicTest.php b/tests/DocumentBasicTest.php index eb3d66c8..73f7eb3a 100644 --- a/tests/DocumentBasicTest.php +++ b/tests/DocumentBasicTest.php @@ -321,6 +321,25 @@ public function testCreateAndDeleteDocumentSilent() static::assertTrue($documentHandler->remove($document, ['silent' => true])); } + + + /** + * Try to create and silently delete a document + */ + public function testDeleteDocumentSilentWithError() + { + $connection = $this->connection; + $collection = $this->collection; + $document = new Document(); + $documentHandler = new DocumentHandler($connection); + + $document = Document::createFromArray(['_key' => 'does-not-exist']); + try { + $documentHandler->removeById($collection, $document, ['silent' => true]); + } catch (\Exception $exception404) { + } + static::assertEquals(404, $exception404->getCode()); + } /** From c15605adb2af65cde9325993cf7e921329b52dbb Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 23 Apr 2021 14:58:42 +0200 Subject: [PATCH 053/101] CHANGELOG improvements --- CHANGELOG.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43d65556..8cb8d4dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,16 +12,19 @@ in a previous release and is not available in ArangoDB 3.9 anymore: ## Release notes for the ArangoDB-PHP driver 3.8.x The driver now supports connecting via JWT if the server's JWT secret is known. -In order to use a JWT to connect, set the following value in ConnectionOptions: +In order to use a JWT to connect, set the following values in ConnectionOptions: ``` $connectionOptions = [ ArangoDBClient\ConnectionOptions::OPTION_DATABASE => '_system', // database name ArangoDBClient\ConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529', // endpoint to connect to + ... ArangoDBClient\ConnectionOptions::OPTION_AUTH_TYPE => 'Bearer', // authentication via JWT! ArangoDBClient\ConnectionOptions::OPTION_AUTH_USER => 'root', // user name ArangoDBClient\ConnectionOptions::OPTION_AUTH_PASSWD => 'jwt-secret-value', // server's JWT secret value, ]; ``` +Note that the server's JWT _secret_, not a generated JWT, must go into the `OPTION_AUTH_PASSWD` +ConnectionOption. The driver now supports the following options for document CRUD operations: - "overwriteMode" @@ -53,19 +56,26 @@ corresponding server-side APIs have been deprecated in ArangoDB 3.8: In addition, the following functionality is deprecated: -- CollectionHandler::load() -- CollectionHandler::unload() -- AdminHandler::getServerStatistics() -- AdminHandler::getServerStatisticsDescription() +- DocumentHandler::store(): use DocumentHandeler::insert() with overwriteMode instead +- DocumentHandler::save(): use DocumentHandeler::insert() instead +- CollectionHandler::load(): should not be necessary anymore +- CollectionHandler::unload(): should not be necessary anymore +- AdminHandler::getServerStatistics(): use getServerMetrics() instead +- AdminHandler::getServerStatisticsDescription(): use getServerMetrics() instead -The following options have been removed in class Collection: +The following server-side options have been removed in class Collection: - isVolatile - journalSize -The following functions have been removed in class Collection: +This also led to the removal of The following functions in class Collection: - setJournalSize(), getJournalSize() - setIsVolatile(), getIsVolatile() +The original driver namespace `\triagens\ArangoDb` was replaced with `\ArangoDBClient` +for driver version 3.2. Each class exposed by the driver is also exposed via an alias +to the old namespace. Using the old namespace `\triagens\ArangoDb` is deprecated and will +not be supported in future versions of the driver. + ## Release notes for the ArangoDB-PHP driver 3.7.x The corresponding ArangoDB version, ArangoDB 3.7 has dropped support for the MMFiles storage From ab007712b910f2623984d73be4ef123b2ca0c576 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 23 Apr 2021 16:19:17 +0200 Subject: [PATCH 054/101] added insertMany method --- CHANGELOG.md | 5 + lib/ArangoDBClient/Connection.php | 13 +- lib/ArangoDBClient/DocumentHandler.php | 159 ++++++++++++++----- lib/ArangoDBClient/Handler.php | 7 +- tests/DocumentBasicTest.php | 211 ++++++++++++++++++++++++- 5 files changed, 338 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cb8d4dd..18553977 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,11 @@ in a previous release and is not available in ArangoDB 3.9 anymore: ## Release notes for the ArangoDB-PHP driver 3.8.x +Added CollectionHandler::insertMany() method to simplify insertion of multiple documents +at once. This is now the preferred way of inserting mutliple documents in a single +request, and will perform much better than using the `Batch` functionality, which is +now deprecated. + The driver now supports connecting via JWT if the server's JWT secret is known. In order to use a JWT to connect, set the following values in ConnectionOptions: ``` diff --git a/lib/ArangoDBClient/Connection.php b/lib/ArangoDBClient/Connection.php index 0910f1de..265d43dd 100644 --- a/lib/ArangoDBClient/Connection.php +++ b/lib/ArangoDBClient/Connection.php @@ -904,24 +904,19 @@ public static function check_encoding($data) * internally it calls the check_encoding() method. If that method does not throw * an Exception, this method will happily return the json_encoded data. * - * @param mixed $data the data to encode - * @param mixed $options the options for the json_encode() call + * @param mixed $data the data to encode + * @param bool $forceObjects whether or not to force JSON objects on empty data * * @return string the result of the json_encode * @throws \ArangoDBClient\ClientException */ - public function json_encode_wrapper($data, $options = 0) + public function json_encode_wrapper($data, $forceObjects = true) { if ($this->_options[ConnectionOptions::OPTION_CHECK_UTF8_CONFORM] === true) { self::check_encoding($data); } - if (empty($data)) { - $response = json_encode($data, $options | JSON_FORCE_OBJECT); - } else { - $response = json_encode($data, $options); - } - return $response; + return json_encode($data, (empty($data) && $forceObjects) ? JSON_FORCE_OBJECT : 0); } diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index 5f18fd91..948dc512 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -302,6 +302,7 @@ protected function createFromArrayWithContext($data, $options) *

    * * @return mixed - id of document created + * @deprecated use insert with overwriteMode=update or overwriteMode=replace instead * @since 1.0 */ public function store(Document $document, $collection = null, array $options = []) @@ -355,42 +356,13 @@ public function store(Document $document, $collection = null, array $options = [ */ public function insert($collection, $document, array $options = []) { - $headers = []; - $this->addTransactionHeader($headers, $collection); - - $collection = $this->makeCollection($collection); - $_documentClass = $this->_documentClass; - - if (!isset($options[self::OPTION_OVERWRITE_MODE]) && - isset($options[self::OPTION_OVERWRITE])) { - // map "overwrite" to "overwriteMode" - $options[self::OPTION_OVERWRITE_MODE] = $options[self::OPTION_OVERWRITE] ? 'replace' : 'conflict'; - unset($options[self::OPTION_OVERWRITE]); - } - - $params = $this->includeOptionsInParams( - $options, [ - 'waitForSync' => $this->getConnectionOption(ConnectionOptions::OPTION_WAIT_SYNC), - 'returnOld' => (bool) @$options[self::OPTION_RETURN_OLD], - 'returnNew' => (bool) @$options[self::OPTION_RETURN_NEW], - ] - ); - - if ((isset($options['createCollection']) && $options['createCollection']) || - $this->getConnection()->getOption(ConnectionOptions::OPTION_CREATE)) { - $this->lazyCreateCollection($collection, $params); - } - - $url = UrlHelper::appendParamsUrl(Urls::URL_DOCUMENT . '/' . $collection, $params); - if (is_array($document)) { $data = $document; } else { $data = $document->getAllForInsertUpdate(); } - - $response = $this->getConnection()->post($url, $this->json_encode_wrapper($data), $headers); - $json = $response->getJson(); + + $response = $this->post($collection, $data, $options); // This makes sure that if we're in batch mode, it will not go further and choke on the checks below. // Caution: Instead of a document ID, we are returning the batchpart object @@ -400,30 +372,32 @@ public function insert($collection, $document, array $options = []) return $batchPart; } - if (@$params[self::OPTION_SILENT]) { + if (@$options[self::OPTION_SILENT]) { // nothing will be returned here return null; } + + $json = $response->getJson(); - if ($params[self::OPTION_RETURN_OLD] || $params[self::OPTION_RETURN_NEW]) { + if (@$options[self::OPTION_RETURN_OLD] || @$options[self::OPTION_RETURN_NEW]) { return $json; } + $_documentClass = $this->_documentClass; if (is_array($document)) { return $json[$_documentClass::ENTRY_KEY]; } + $document->setInternalKey($json[$_documentClass::ENTRY_KEY]); + $document->setInternalId($json[$_documentClass::ENTRY_ID]); + $document->setRevision($json[$_documentClass::ENTRY_REV]); + $location = $response->getLocationHeader(); if (!$location) { throw new ClientException('Did not find location header in server response'); } $id = UrlHelper::getDocumentIdFromLocation($location); - - $document->setInternalKey($json[$_documentClass::ENTRY_KEY]); - $document->setInternalId($json[$_documentClass::ENTRY_ID]); - $document->setRevision($json[$_documentClass::ENTRY_REV]); - if ($id !== $document->getId()) { throw new ClientException('Got an invalid response from the server'); } @@ -433,10 +407,111 @@ public function insert($collection, $document, array $options = []) return $document->getId(); } + + /** + * insert multiple document into a collection + * + * This will add the documents to the collection and return the documents' metadata + * + * This will throw if the documents cannot be saved + * + * @throws Exception + * + * @param mixed $collection - collection id as string or number + * @param array $documents - the documents to be added, always an array + * @param array $options - optional, array of options + *

    Options are :
    + *

  • 'createCollection' - create the collection if it does not yet exist.
  • + *
  • 'waitForSync' - if set to true, then all removal operations will instantly be synchronised to disk / If this is not specified, then the collection's default sync behavior will be applied.
  • + *
  • 'keepNull' - can be used to instruct ArangoDB to delete existing attributes on update instead setting their values to null. Defaults to true (keep attributes when set to null). only useful with overwriteMode = update
  • + *
  • 'mergeObjects' - if true, updates to object attributes will merge the previous and the new objects. if false, replaces the object attribute with the new value. only useful with overwriteMode = update
  • + *
  • 'overwriteMode' - determines overwrite behavior in case a document with the same _key already exists. possible values: 'ignore', 'update', 'replace', 'conflict'.
  • + *
  • 'overwrite' - deprecated: if set to true, will turn the insert into a replace operation if a document with the specified key already exists.
  • + *
  • 'returnNew' - if set to true, then the newly created document will be returned.
  • + *
  • 'returnOld' - if set to true, then the updated/replaced document will be returned - useful only when using overwriteMode = insert/update.
  • + *
  • 'silent' - whether or not to return information about the created document (e.g. _key and _rev).
  • + *

    + * + * @return array - array of document metadata (one entry per document) + * @since 3.8 + */ + public function insertMany($collection, array $documents, array $options = []) + { + $data = []; + foreach ($documents as $document) { + if (is_array($document)) { + $data[] = $document; + } else { + $data[] = $document->getAllForInsertUpdate(); + } + } + + $response = $this->post($collection, $data, $options); + + // This makes sure that if we're in batch mode, it will not go further and choke on the checks below. + // Caution: Instead of a document ID, we are returning the batchpart object + // The Id of the BatchPart can be retrieved by calling getId() on it. + // We're basically returning an object here, in order not to accidentally use the batch part id as the document id + if ($batchPart = $response->getBatchPart()) { + return $batchPart; + } + + return $response->getJson(); + } + + + /** + * Insert documents into a collection (internal method) + * + * @throws Exception + * + * @param string $collection - collection id as string or number + * @param mixed $data - document data + * @param array $options - array of options + * + * @internal + * + * @return HttpResponse - the insert response + */ + protected function post($collection, $data, array $options) + { + $headers = []; + $this->addTransactionHeader($headers, $collection); + + $collection = $this->makeCollection($collection); + + if (!isset($options[self::OPTION_OVERWRITE_MODE]) && + isset($options[self::OPTION_OVERWRITE])) { + // map "overwrite" to "overwriteMode" + $options[self::OPTION_OVERWRITE_MODE] = $options[self::OPTION_OVERWRITE] ? 'replace' : 'conflict'; + unset($options[self::OPTION_OVERWRITE]); + } + + $params = $this->includeOptionsInParams( + $options, [ + 'waitForSync' => $this->getConnectionOption(ConnectionOptions::OPTION_WAIT_SYNC), + 'returnOld' => (bool) @$options[self::OPTION_RETURN_OLD], + 'returnNew' => (bool) @$options[self::OPTION_RETURN_NEW], + ] + ); + + if ((isset($options['createCollection']) && $options['createCollection']) || + $this->getConnection()->getOption(ConnectionOptions::OPTION_CREATE)) { + $this->lazyCreateCollection($collection, $params); + } + + $url = UrlHelper::appendParamsUrl(Urls::URL_DOCUMENT . '/' . $collection, $params); + + return $this->getConnection()->post($url, $this->json_encode_wrapper($data, false), $headers); + } + + /** * Insert a document into a collection * * This is an alias for insert(). + * + * * @deprecated use insert instead */ public function save($collection, $document, array $options = []) { @@ -534,7 +609,6 @@ protected function patch($url, $collection, $documentId, Document $document, arr $this->addTransactionHeader($headers, $collection); $collection = $this->makeCollection($collection); - $_documentClass = $this->_documentClass; $params = $this->includeOptionsInParams( $options, [ @@ -568,7 +642,8 @@ protected function patch($url, $collection, $documentId, Document $document, arr return null; } - $json = $result->getJson(); + $json = $result->getJson(); + $_documentClass = $this->_documentClass; $document->setRevision($json[$_documentClass::ENTRY_REV]); if (@$options[self::OPTION_RETURN_OLD] || @$options[self::OPTION_RETURN_NEW]) { @@ -668,7 +743,6 @@ protected function put($url, $collection, $documentId, Document $document, array $this->addTransactionHeader($headers, $collection); $collection = $this->makeCollection($collection); - $_documentClass = $this->_documentClass; $params = $this->includeOptionsInParams( $options, [ @@ -700,7 +774,8 @@ protected function put($url, $collection, $documentId, Document $document, array return null; } - $json = $result->getJson(); + $json = $result->getJson(); + $_documentClass = $this->_documentClass; $document->setRevision($json[$_documentClass::ENTRY_REV]); if (@$options[self::OPTION_RETURN_OLD] || @$options[self::OPTION_RETURN_NEW]) { diff --git a/lib/ArangoDBClient/Handler.php b/lib/ArangoDBClient/Handler.php index 15ee4488..41e39d03 100644 --- a/lib/ArangoDBClient/Handler.php +++ b/lib/ArangoDBClient/Handler.php @@ -72,14 +72,15 @@ protected function getConnectionOption($optionName) * Return a json encoded string for the array passed. * This is a convenience function that calls json_encode_wrapper on the connection * - * @param array $body - The body to encode into json + * @param mixed $data the data to encode + * @param bool $forceObjects whether or not to force JSON objects on empty data * * @return string - json string of the body that was passed * @throws \ArangoDBClient\ClientException */ - protected function json_encode_wrapper($body) + protected function json_encode_wrapper($data, $forceObjects = true) { - return $this->getConnection()->json_encode_wrapper($body); + return $this->getConnection()->json_encode_wrapper($data, $forceObjects); } diff --git a/tests/DocumentBasicTest.php b/tests/DocumentBasicTest.php index 73f7eb3a..e61cc28e 100644 --- a/tests/DocumentBasicTest.php +++ b/tests/DocumentBasicTest.php @@ -73,7 +73,7 @@ public function testInsertSilent() $document = Document::createFromArray(['_key' => 'me', 'value' => 1]); $documentHandler = new DocumentHandler($connection); - $document = $documentHandler->insert($collection->getName(), $document, ['silent' => true ]); + $document = $documentHandler->insert($collection->getName(), $document, ['silent' => true]); static::assertNull($document); } @@ -89,7 +89,7 @@ public function testInsertSilentWithError() $documentHandler = new DocumentHandler($connection); // insert the document once - $result = $documentHandler->insert($collection->getName(), $document, ['silent' => true ]); + $result = $documentHandler->insert($collection->getName(), $document, ['silent' => true]); static::assertNull($result); // and try to insert it again @@ -111,7 +111,7 @@ public function testInsertReturnNew() $document = Document::createFromArray(['_key' => 'me', 'value' => 1]); $documentHandler = new DocumentHandler($connection); - $document = $documentHandler->insert($collection->getName(), $document, ['returnNew' => true ]); + $document = $documentHandler->insert($collection->getName(), $document, ['returnNew' => true]); static::assertEquals('me', $document['_key']); static::assertEquals('me', $document['new']['_key']); @@ -119,6 +119,211 @@ public function testInsertReturnNew() } + /** + * Try to insert many documents + */ + public function testInsertMany() + { + $connection = $this->connection; + $collection = $this->collection; + + $documents = []; + $documents[] = Document::createFromArray(['_key' => 'test1', 'value' => 1]); + $documents[] = Document::createFromArray(['_key' => 'test2', 'value' => 2]); + $documents[] = Document::createFromArray(['_key' => 'test3', 'value' => 3]); + $documents[] = Document::createFromArray(['_key' => 'test4', 'value' => 4]); + + $documentHandler = new DocumentHandler($connection); + + $result = $documentHandler->insertMany($collection->getName(), $documents); + static::assertTrue(is_array($result)); + static::assertEquals(4, count($result)); + + foreach ($result as $i => $doc) { + static::assertArrayHasKey('_id', $doc); + static::assertArrayHasKey('_key', $doc); + static::assertArrayHasKey('_rev', $doc); + static::assertEquals('test' . ($i + 1) , $doc['_key']); + } + } + + + /** + * Try to insert many documents, return new + */ + public function testInsertManyReturnNew() + { + $connection = $this->connection; + $collection = $this->collection; + + $documents = []; + $documents[] = Document::createFromArray(['_key' => 'test1', 'value' => 1]); + $documents[] = Document::createFromArray(['_key' => 'test2', 'value' => 2]); + $documents[] = Document::createFromArray(['_key' => 'test3', 'value' => 3]); + $documents[] = Document::createFromArray(['_key' => 'test4', 'value' => 4]); + + $documentHandler = new DocumentHandler($connection); + + $result = $documentHandler->insertMany($collection->getName(), $documents, ['returnNew' => true]); + static::assertTrue(is_array($result)); + static::assertEquals(4, count($result)); + + foreach ($result as $i => $doc) { + static::assertArrayHasKey('_id', $doc); + static::assertArrayHasKey('_key', $doc); + static::assertArrayHasKey('_rev', $doc); + static::assertEquals('test' . ($i + 1) , $doc['_key']); + static::assertArrayHasKey('new', $doc); + static::assertEquals('test' . ($i + 1) , $doc['new']['_key']); + static::assertEquals($i + 1 , $doc['new']['value']); + } + } + + + /** + * Try to insert many documents, silent + */ + public function testInsertManySilent() + { + $connection = $this->connection; + $collection = $this->collection; + + $documents = []; + $documents[] = Document::createFromArray(['_key' => 'test1', 'value' => 1]); + $documents[] = Document::createFromArray(['_key' => 'test2', 'value' => 2]); + $documents[] = Document::createFromArray(['_key' => 'test3', 'value' => 3]); + $documents[] = Document::createFromArray(['_key' => 'test4', 'value' => 4]); + + $documentHandler = new DocumentHandler($connection); + + $result = $documentHandler->insertMany($collection->getName(), $documents, ['silent' => true]); + static::assertTrue(is_array($result)); + static::assertEquals(0, count($result)); + } + + + /** + * Try to insert many documents, with errors + */ + public function testInsertManyWithErrors() + { + $connection = $this->connection; + $collection = $this->collection; + + $documents = []; + $documents[] = Document::createFromArray(['_key' => 'test1', 'value' => 1]); + $documents[] = Document::createFromArray(['_key' => 'test2', 'value' => 2]); + $documents[] = Document::createFromArray(['_key' => 'test1', 'value' => 3]); + $documents[] = Document::createFromArray(['_key' => 'test2', 'value' => 4]); + + $documentHandler = new DocumentHandler($connection); + + $result = $documentHandler->insertMany($collection->getName(), $documents); + static::assertTrue(is_array($result)); + static::assertEquals(4, count($result)); + + foreach ($result as $i => $doc) { + if ($i < 2) { + static::assertArrayHasKey('_id', $doc); + static::assertArrayHasKey('_key', $doc); + static::assertArrayHasKey('_rev', $doc); + static::assertEquals('test' . ($i + 1) , $doc['_key']); + } else { + static::assertArrayHasKey('error', $doc); + static::assertArrayHasKey('errorNum', $doc); + static::assertArrayHasKey('errorMessage', $doc); + static::assertTrue($doc['error']); + static::assertEquals(1210, $doc['errorNum']); + } + } + } + + + /** + * Try to insert many documents, with errors, silent + */ + public function testInsertManySilentWithErrors() + { + $connection = $this->connection; + $collection = $this->collection; + + $documents = []; + $documents[] = Document::createFromArray(['_key' => 'test1', 'value' => 1]); + $documents[] = Document::createFromArray(['_key' => 'test2', 'value' => 2]); + $documents[] = Document::createFromArray(['_key' => 'test1', 'value' => 3]); + $documents[] = Document::createFromArray(['_key' => 'test2', 'value' => 4]); + + $documentHandler = new DocumentHandler($connection); + + $result = $documentHandler->insertMany($collection->getName(), $documents, ['silent' => true]); + static::assertTrue(is_array($result)); + static::assertEquals(2, count($result)); + + foreach ($result as $i => $doc) { + static::assertArrayHasKey('error', $doc); + static::assertArrayHasKey('errorNum', $doc); + static::assertArrayHasKey('errorMessage', $doc); + static::assertTrue($doc['error']); + static::assertEquals(1210, $doc['errorNum']); + } + } + + + /** + * Try to insert many documents, large request + */ + public function testInsertManyLarge() + { + $connection = $this->connection; + $collection = $this->collection; + + $documents = []; + for ($i = 0; $i < 5000; ++$i) { + $documents[] = ['_key' => 'test' . $i, 'value' => $i]; + } + $documents[] = ['_key' => 'test0', 'value' => 2]; + + $documentHandler = new DocumentHandler($connection); + + $result = $documentHandler->insertMany($collection->getName(), $documents, ['returnNew' => true]); + static::assertTrue(is_array($result)); + static::assertEquals(5001, count($result)); + + foreach ($result as $i => $doc) { + if ($i < 5000) { + static::assertArrayHasKey('_id', $doc); + static::assertArrayHasKey('_key', $doc); + static::assertArrayHasKey('_rev', $doc); + static::assertEquals('test' . $i , $doc['_key']); + static::assertArrayHasKey('new', $doc); + static::assertEquals('test' . $i , $doc['new']['_key']); + static::assertEquals($i , $doc['new']['value']); + } else { + static::assertArrayHasKey('error', $doc); + static::assertArrayHasKey('errorNum', $doc); + static::assertArrayHasKey('errorMessage', $doc); + static::assertTrue($doc['error']); + static::assertEquals(1210, $doc['errorNum']); + } + } + } + + /** + * Try to call insertMany with 0 documents + */ + public function testInsertManyEmpty() + { + $connection = $this->connection; + $collection = $this->collection; + + $documentHandler = new DocumentHandler($connection); + + $result = $documentHandler->insertMany($collection->getName(), []); + static::assertTrue(is_array($result)); + static::assertEquals(0, count($result)); + } + + /** * Try to create a document and overwrite it, using deprecated overwrite option */ From 37c330e1f0742b2606417390a8533984e263e3e2 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 23 Apr 2021 16:38:21 +0200 Subject: [PATCH 055/101] added Cursor methods --- lib/ArangoDBClient/Cursor.php | 21 +++++++++++++++++ tests/StatementTest.php | 44 +++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/lib/ArangoDBClient/Cursor.php b/lib/ArangoDBClient/Cursor.php index 7e946ce1..816449cc 100644 --- a/lib/ArangoDBClient/Cursor.php +++ b/lib/ArangoDBClient/Cursor.php @@ -833,6 +833,27 @@ public function getFiltered() { return $this->getStatValue('filtered'); } + + /** + * Return the peak memory usage of the query + * + * @return int + */ + public function getPeakMemoryUsage() + { + return $this->getStatValue('peakMemoryUsage'); + } + + + /** + * Return the execution time of the query + * + * @return float + */ + public function getExecutionTime() + { + return $this->getStatValue('executionTime'); + } /** * Return the number of HTTP calls that were made to build the cursor result diff --git a/tests/StatementTest.php b/tests/StatementTest.php index 972a3e01..e8ca39b6 100644 --- a/tests/StatementTest.php +++ b/tests/StatementTest.php @@ -155,6 +155,50 @@ public function testStatementFailWithMemoryLimit() static::assertEquals(32, $e->getServerCode()); } } + + + /** + * Test statistics returned by query + */ + public function testStatisticsPeakMemoryUsage() + { + $connection = $this->connection; + $collection = $this->collection; + + $statement = new Statement($connection, ['_flat' => true]); + $statement->setQuery('RETURN (FOR i IN 1..1000 RETURN CONCAT("test", i))'); + $cursor = $statement->execute(); + + $extra = $cursor->getExtra(); + static::assertEquals([], $extra['warnings']); + + static::assertArrayHasKey('peakMemoryUsage', $extra['stats']); + static::assertTrue($extra['stats']['peakMemoryUsage'] > 0); + static::assertTrue($cursor->getPeakMemoryUsage() > 0); + static::assertEquals($extra['stats']['peakMemoryUsage'], $cursor->getPeakMemoryUsage()); + } + + + /** + * Test statistics returned by query + */ + public function testStatisticsExecutionTime() + { + $connection = $this->connection; + $collection = $this->collection; + + $statement = new Statement($connection, ['_flat' => true]); + $statement->setQuery('RETURN SLEEP(3)'); + $cursor = $statement->execute(); + + $extra = $cursor->getExtra(); + static::assertEquals([], $extra['warnings']); + + static::assertArrayHasKey('executionTime', $extra['stats']); + static::assertTrue($extra['stats']['executionTime'] >= 3.0); + static::assertTrue($cursor->getExecutionTime() >= 3.0); + static::assertEquals($extra['stats']['executionTime'], $cursor->getExecutionTime()); + } /** From 97fcb6b61306e40d22f5c2032db4e40641f9ee5c Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 23 Apr 2021 17:03:54 +0200 Subject: [PATCH 056/101] added support for shard count --- lib/ArangoDBClient/CollectionHandler.php | 13 +++-- lib/ArangoDBClient/Connection.php | 12 ++++- lib/ArangoDBClient/ConnectionOptions.php | 5 ++ tests/CollectionBasicTest.php | 60 ++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 9 deletions(-) diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index f0d4c0bd..3ece4e03 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -394,22 +394,21 @@ public function has($collection) * @throws Exception * * @param mixed $collection - collection id as a string or number + * @param bool $details - optional, will provide per-shard counts in a cluster * - * @return int - the number of documents in the collection + * @return mixed - int if details=false, the number of documents in the collection, array if details=true */ - public function count($collection) + public function count($collection, $details = false) { $headers = []; $this->addTransactionHeader($headers, $collection); $collection = $this->makeCollection($collection); $url = UrlHelper::buildUrl(Urls::URL_COLLECTION, [$collection, self::OPTION_COUNT]); + $url = UrlHelper::appendParamsUrl($url, ['details' => $details]); $response = $this->getConnection()->get($url, $headers); - - $data = $response->getJson(); - $count = $data[self::OPTION_COUNT]; - - return (int) $count; + $data = $response->getJson(); + return $data[self::OPTION_COUNT]; } diff --git a/lib/ArangoDBClient/Connection.php b/lib/ArangoDBClient/Connection.php index 265d43dd..ef4db507 100644 --- a/lib/ArangoDBClient/Connection.php +++ b/lib/ArangoDBClient/Connection.php @@ -424,9 +424,17 @@ private function updateHttpHeader() $this->_httpHeader .= sprintf('Host: %s%s', Endpoint::getHost($endpoint), HttpHelper::EOL); } - if (isset($this->_options[ConnectionOptions::OPTION_AUTH_TYPE], $this->_options[ConnectionOptions::OPTION_AUTH_USER])) { + if (isset($this->_options[ConnectionOptions::OPTION_AUTH_JWT])) { + // JWT, used as is + $this->_httpHeader .= sprintf( + 'Authorization: Bearer %s%s', + $this->_options[ConnectionOptions::OPTION_AUTH_JWT], + HttpHelper::EOL + ); + } else if (isset($this->_options[ConnectionOptions::OPTION_AUTH_TYPE], $this->_options[ConnectionOptions::OPTION_AUTH_USER])) { + // create a JWT for a given user and server's JWT secret if ($this->_options[ConnectionOptions::OPTION_AUTH_TYPE] == 'Bearer') { - // JWT + // JWT secret $base = json_encode(['typ' => 'JWT', 'alg' => 'HS256']); $base64UrlHeader = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($base)); $payload = json_encode([ diff --git a/lib/ArangoDBClient/ConnectionOptions.php b/lib/ArangoDBClient/ConnectionOptions.php index 679a72d6..511225dd 100644 --- a/lib/ArangoDBClient/ConnectionOptions.php +++ b/lib/ArangoDBClient/ConnectionOptions.php @@ -169,6 +169,11 @@ class ConnectionOptions implements \ArrayAccess * Wait for sync index constant */ const OPTION_IS_SYSTEM = 'isSystem'; + + /** + * Authentication JWT + */ + const OPTION_AUTH_JWT = 'Jwt'; /** * Authentication user name diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 3f9851ee..fb254e94 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -1287,6 +1287,66 @@ public function testHasCollectionReturnsTrueIfCollectionExists() } + /** + * count + */ + public function testCollectionCountDetailed() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + $connection = $this->connection; + $collectionHandler = new CollectionHandler($connection); + + $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; + + try { + $collectionHandler->drop($name); + } catch (Exception $e) { + //Silence the exception + } + + $collection = Collection::createFromArray(['name' => $name, 'numberOfShards' => 5]); + $collectionHandler->create($collection); + + $count = $collectionHandler->count($collection, false); + static::assertEquals(0, $count); + + $count = $collectionHandler->count($collection, true); + static::assertTrue(is_array($count)); + static::assertEquals(5, count($count)); + + foreach ($count as $shard => $value) { + static::assertEquals('s', $shard[0]); + static::assertEquals(0, $value); + } + + // fill with data + $statement = new Statement($connection, []); + $statement->setQuery('FOR i IN 1..1000 INSERT {} IN ' . $collection->getName()); + $cursor = $statement->execute(); + + $count = $collectionHandler->count($collection, false); + static::assertEquals(1000, $count); + + $count = $collectionHandler->count($collection, true); + static::assertTrue(is_array($count)); + static::assertEquals(5, count($count)); + + $sum = 0; + foreach ($count as $shard => $value) { + static::assertEquals('s', $shard[0]); + static::assertTrue($value > 0); + $sum += $value; + } + + static::assertEquals(1000, $sum); + } + + /** * get shards */ From 8ba4ce5e9bc0d712e9568ff197eac0bba60883ea Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 23 Apr 2021 17:04:13 +0200 Subject: [PATCH 057/101] updated CHANGELOG --- CHANGELOG.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18553977..a0389b58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,12 +25,23 @@ $connectionOptions = [ ... ArangoDBClient\ConnectionOptions::OPTION_AUTH_TYPE => 'Bearer', // authentication via JWT! ArangoDBClient\ConnectionOptions::OPTION_AUTH_USER => 'root', // user name - ArangoDBClient\ConnectionOptions::OPTION_AUTH_PASSWD => 'jwt-secret-value', // server's JWT secret value, + ArangoDBClient\ConnectionOptions::OPTION_AUTH_PASSWD => 'jwt-secret-value', // server's JWT secret value ]; ``` Note that the server's JWT _secret_, not a generated JWT, must go into the `OPTION_AUTH_PASSWD` ConnectionOption. +In order to use an already generated JWT without any username, set the ConnectionOptions +as follows: +``` +$connectionOptions = [ + ArangoDBClient\ConnectionOptions::OPTION_DATABASE => '_system', // database name + ArangoDBClient\ConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529', // endpoint to connect to + ... + ArangoDBClient\ConnectionOptions::OPTION_AUTH_JWT => '.......', // full JWT needs to go here + ]; +``` + The driver now supports the following options for document CRUD operations: - "overwriteMode" - "silent" From 51a3b60b48b340c8228140778a3b366415c6d0f1 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 23 Apr 2021 17:20:03 +0200 Subject: [PATCH 058/101] adjust cluster tests --- tests/DocumentBasicTest.php | 41 +++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/tests/DocumentBasicTest.php b/tests/DocumentBasicTest.php index e61cc28e..ea87a47f 100644 --- a/tests/DocumentBasicTest.php +++ b/tests/DocumentBasicTest.php @@ -198,7 +198,12 @@ public function testInsertManySilent() $result = $documentHandler->insertMany($collection->getName(), $documents, ['silent' => true]); static::assertTrue(is_array($result)); - static::assertEquals(0, count($result)); + + if (isCluster($this->connection)) { + static::assertEquals(4, count($result)); + } else { + static::assertEquals(0, count($result)); + } } @@ -257,14 +262,34 @@ public function testInsertManySilentWithErrors() $result = $documentHandler->insertMany($collection->getName(), $documents, ['silent' => true]); static::assertTrue(is_array($result)); - static::assertEquals(2, count($result)); + + if (isCluster($this->connection)) { + static::assertEquals(4, count($result)); + + foreach ($result as $i => $doc) { + if ($i < 2) { + static::assertArrayHasKey('_id', $doc); + static::assertArrayHasKey('_key', $doc); + static::assertArrayHasKey('_rev', $doc); + static::assertEquals('test' . ($i + 1) , $doc['_key']); + } else { + static::assertArrayHasKey('error', $doc); + static::assertArrayHasKey('errorNum', $doc); + static::assertArrayHasKey('errorMessage', $doc); + static::assertTrue($doc['error']); + static::assertEquals(1210, $doc['errorNum']); + } + } + } else { + static::assertEquals(2, count($result)); - foreach ($result as $i => $doc) { - static::assertArrayHasKey('error', $doc); - static::assertArrayHasKey('errorNum', $doc); - static::assertArrayHasKey('errorMessage', $doc); - static::assertTrue($doc['error']); - static::assertEquals(1210, $doc['errorNum']); + foreach ($result as $i => $doc) { + static::assertArrayHasKey('error', $doc); + static::assertArrayHasKey('errorNum', $doc); + static::assertArrayHasKey('errorMessage', $doc); + static::assertTrue($doc['error']); + static::assertEquals(1210, $doc['errorNum']); + } } } From ec4d32d187e7e3bc2ab0e262e278e1130b5e81ba Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 28 Apr 2021 09:08:12 +0200 Subject: [PATCH 059/101] added query profiling --- lib/ArangoDBClient/Statement.php | 41 +++++++++++++++++++++++++++++++- tests/StatementTest.php | 29 ++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/lib/ArangoDBClient/Statement.php b/lib/ArangoDBClient/Statement.php index 52a9dc7e..b60fb7a3 100644 --- a/lib/ArangoDBClient/Statement.php +++ b/lib/ArangoDBClient/Statement.php @@ -149,6 +149,13 @@ class Statement * @var bool */ private $_failOnWarning = false; + + /** + * Whether or not the query should return profiling information + * + * @var bool + */ + private $_profile = false; /** * Approximate memory limit value (in bytes) that a query can use on the server-side @@ -202,6 +209,11 @@ class Statement */ const ENTRY_FAIL_ON_WARNING = 'failOnWarning'; + /** + * Profile flag + */ + const ENTRY_PROFILE = 'profile'; + /** * Memory limit threshold for query */ @@ -309,6 +321,10 @@ public function __construct(Connection $connection, array $data) $this->_failOnWarning = (bool) $data[self::ENTRY_FAIL_ON_WARNING]; } + if (isset($data[self::ENTRY_PROFILE])) { + $this->_profile = (bool) $data[self::ENTRY_PROFILE]; + } + if (isset($data[self::ENTRY_MEMORY_LIMIT])) { $this->_memoryLimit = (int) $data[self::ENTRY_MEMORY_LIMIT]; } @@ -658,6 +674,28 @@ public function getFailOnWarning() return $this->_failOnWarning; } + /** + * Set whether or not query profiling should be enabled + * + * @param bool $value - value for profiling + * + * @return void + */ + public function setProfile($value = true) + { + $this->_profile = (bool) $value; + } + + /** + * Get the configured value for profiling + * + * @return bool - current value of profiling option + */ + public function getProfiling() + { + return $this->_profile; + } + /** * Set the approximate memory limit threshold to be used by the query on the server-side * (a value of 0 or less will mean the memory is not limited) @@ -729,7 +767,8 @@ private function buildData() self::ENTRY_COUNT => $this->_doCount, 'options' => [ self::FULL_COUNT => $this->_fullCount, - self::ENTRY_FAIL_ON_WARNING => $this->_failOnWarning + self::ENTRY_FAIL_ON_WARNING => $this->_failOnWarning, + self::ENTRY_PROFILE => $this->_profile ] ]; diff --git a/tests/StatementTest.php b/tests/StatementTest.php index e8ca39b6..7961fea7 100644 --- a/tests/StatementTest.php +++ b/tests/StatementTest.php @@ -609,6 +609,35 @@ public function testMaxRuntime() static::assertTrue($excepted); } + public function testProfiling() + { + $connection = $this->connection; + + $statement = new Statement( + $connection, [ + 'query' => 'FOR i IN 1..10000 RETURN CONCAT("testisiteisiitit", i)', + '_flat' => true + ] + ); + static::assertFalse($statement->getProfiling()); + + $statement = new Statement( + $connection, [ + 'query' => 'FOR i IN 1..10000 RETURN CONCAT("testisiteisiitit", i)', + 'profile' => true, + '_flat' => true + ] + ); + + static::assertTrue($statement->getProfiling()); + + $cursor = $statement->execute(); + $result = $cursor->getExtra(); + static::assertArrayHasKey('profile', $result); + static::assertTrue(is_array($result['profile'])); + static::assertArrayHasKey('executing', $result['profile']); + } + public function testStatementStreaming() { $connection = $this->connection; From d3642ce45b6ccb3924ee047bde2f601195ad779d Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 28 Apr 2021 09:11:19 +0200 Subject: [PATCH 060/101] updated CHANGELOG --- CHANGELOG.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0389b58..c17fdc35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,13 +45,21 @@ $connectionOptions = [ The driver now supports the following options for document CRUD operations: - "overwriteMode" - "silent" -- "keepNull", "mergeObjects" (for insert API if overwriteMode=update) +- "keepNull", "mergeObjects" (for insert/insertMany API if overwriteMode=update) Extended maximum valid length for collection names to 256, up from 64 before. This follows a change in the ArangoDB server. +Additional options for AQL queries are now supported via `Statement`: +- memoryLimit +- profile +- maxRuntime + Indexes can now be created with "deduplicate" and "estimates" attribute set/not set. +The count functionality in `CollectionHandler::count()` now supports returned the detailed +shard count by passing an extra boolean parameter. + The engine stats API is now supported via `AdminHandler::getEngineStats()`. The metrics API is now supported via `AdminHandler::getMetrics()`. From 643f39f12ff6cb3836c156dff3d220f4710d9927 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 28 Apr 2021 09:14:29 +0200 Subject: [PATCH 061/101] add more PHP versions --- .travis.yml | 3 +++ tests/travis/setup_arangodb.sh | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/.travis.yml b/.travis.yml index eede20e6..6e985cd2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,9 @@ matrix: - php: '5.6' - php: '7.0' - php: '7.1' + - php: '7.2' + - php: '7.3' + - php: '7.4' allow_failures: - php: hhvm diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index 2950ead8..6ca99958 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -17,6 +17,21 @@ wget "https://phar.phpunit.de/phpunit-6.0.phar" mv phpunit-6.0.phar ./phpunit fi +if [[ "$TRAVIS_PHP_VERSION" == "7.2" ]] ; then +wget "https://phar.phpunit.de/phpunit-6.0.phar" +mv phpunit-6.0.phar ./phpunit +fi + +if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]] ; then +wget "https://phar.phpunit.de/phpunit-6.0.phar" +mv phpunit-6.0.phar ./phpunit +fi + +if [[ "$TRAVIS_PHP_VERSION" == "7.4" ]] ; then +wget "https://phar.phpunit.de/phpunit-6.0.phar" +mv phpunit-6.0.phar ./phpunit +fi + if [[ "$TRAVIS_PHP_VERSION" == "hhvm" ]] ; then wget "https://phar.phpunit.de/phpunit-6.0.phar" mv phpunit-6.0.phar ./phpunit From 4599f1fc7e27a268a8c6f589c0069fc8d675e1c0 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 28 Apr 2021 09:16:48 +0200 Subject: [PATCH 062/101] add 3.8 badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 51f10fca..2566922b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ The official ArangoDB PHP Driver. 3.5: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.5)](https://travis-ci.org/arangodb/arangodb-php) 3.6: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.6)](https://travis-ci.org/arangodb/arangodb-php) 3.7: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.7)](https://travis-ci.org/arangodb/arangodb-php) +3.8: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.8)](https://travis-ci.org/arangodb/arangodb-php) devel: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=devel)](https://travis-ci.org/arangodb/arangodb-php) - [Getting Started](https://www.arangodb.com/docs/stable/drivers/php-getting-started.html) From b27f54295bf84df1b7089af78d6b8486aeb86b10 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 28 Apr 2021 13:12:17 +0200 Subject: [PATCH 063/101] update examples --- UNITTESTS.md | 7 ------- examples/aql-query.php | 19 ++++++++++++++----- examples/batch.php | 2 -- examples/init.php | 17 +++++++++++++---- 4 files changed, 27 insertions(+), 18 deletions(-) delete mode 100644 UNITTESTS.md delete mode 100644 examples/batch.php diff --git a/UNITTESTS.md b/UNITTESTS.md deleted file mode 100644 index d999341b..00000000 --- a/UNITTESTS.md +++ /dev/null @@ -1,7 +0,0 @@ -# PHPUnit Tests for ArangoDB-PHP - -To run the unit tests, cd into the `tests` folder and run: - -``` -phpunit --testsuite ArangoDB-PHP -``` diff --git a/examples/aql-query.php b/examples/aql-query.php index 1396eae3..b0b96ea2 100644 --- a/examples/aql-query.php +++ b/examples/aql-query.php @@ -43,17 +43,26 @@ foreach ($statements as $query => $bindVars) { $statement = new Statement($connection, [ - 'query' => $query, - 'count' => true, - 'batchSize' => 1000, - 'bindVars' => $bindVars, - 'sanitize' => true, + 'query' => $query, + 'count' => true, + 'batchSize' => 1000, + 'bindVars' => $bindVars, + 'profile' => false, // turn this on for query profiling + 'memoryLimit' => 16 * 1024 * 1024, // optional server-side memory limit for query + 'maxRuntime' => 10.0, // optional server-side runtime for query + 'sanitize' => true, + '_flat' => false, // set this to true when the query result is not an array of documents + ] ); echo 'RUNNING STATEMENT ' . $statement . PHP_EOL; $cursor = $statement->execute(); + + // get information about query runtime, peak memory usage etc. + // var_dump($cursor->getExtra()); + foreach ($cursor->getAll() as $doc) { echo '- RETURN VALUE: ' . json_encode($doc) . PHP_EOL; } diff --git a/examples/batch.php b/examples/batch.php deleted file mode 100644 index c38e4af6..00000000 --- a/examples/batch.php +++ /dev/null @@ -1,2 +0,0 @@ - 'unix:///tmp/arangodb.sock', // UNIX domain socket ConnectionOptions::OPTION_CONNECTION => 'Keep-Alive', // can use either 'Close' (one-time connections) or 'Keep-Alive' (re-used connections) - ConnectionOptions::OPTION_AUTH_TYPE => 'Basic', // use basic authorization - // authentication parameters (note: must also start server with option `--server.disable-authentication false`) - ConnectionOptions::OPTION_AUTH_USER => 'root', // user for basic authorization - ConnectionOptions::OPTION_AUTH_PASSWD => '', // password for basic authorization + // authentication parameters + ConnectionOptions::OPTION_AUTH_TYPE => 'Basic', // use HTTP Basic authorization + ConnectionOptions::OPTION_AUTH_USER => 'root', // user for Basic authorization + ConnectionOptions::OPTION_AUTH_PASSWD => '', // password for Basic authorization + + // in order to not send passwords, it is possible to make the driver generate a JWT for an existing user. + // this requires knowledge of the server's JWT secret key, however: + // ConnectionOptions::OPTION_AUTH_TYPE => 'Bearer', // use HTTP Bearer authorization + // ConnectionOptions::OPTION_AUTH_USER => 'root', // user name + // ConnectionOptions::OPTION_AUTH_PASSWD => '', // server's JWT secret needs to go in here + + // in order to use an externally generated JWT, there is no need to specify user and passwd, but just the JWT value: + // ConnectionOptions::OPTION_AUTH_JWT => '', // use an externally generated JWT for authorization ConnectionOptions::OPTION_TIMEOUT => 30, // timeout in seconds // ConnectionOptions::OPTION_TRACE => $traceFunc, // tracer function, can be used for debugging From 35bd88a45136a30f33af92333ae0ff1e6b222874 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 28 Apr 2021 13:27:18 +0200 Subject: [PATCH 064/101] fix container id --- tests/travis/setup_arangodb.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index 6ca99958..b5c54669 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -50,7 +50,7 @@ echo "./phpunit --version" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $DIR -docker pull arangodb/arangodb-preview:devel-nightly +docker pull arangodb/arangodb-preview:3.9.0-nightly docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:3.9.0-nightly sleep 2 From 9f061fde542476a27cea743f6f9638fffe27c785 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 9 Jun 2021 10:01:28 +0200 Subject: [PATCH 065/101] add tests and disable them until 3.8.1 --- tests/AnalyzerTest.php | 63 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/tests/AnalyzerTest.php b/tests/AnalyzerTest.php index f7bec85b..5e2d7ecb 100644 --- a/tests/AnalyzerTest.php +++ b/tests/AnalyzerTest.php @@ -85,6 +85,69 @@ public function testCreateTextAnalyzerFail() } static::assertEquals(400, $exception->getCode()); } + + /** + * Test creation of stopwords analyzer + */ + /* disabled until 3.8.1 + public function testCreateStopwordsAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'stopwords', [ "stopwords" => ["foo", "bar", "baz", "dead"] ]); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('stopwords', $result['type']); + static::assertEquals([ "stopwords" => ["foo", "bar", "baz", "dead"] ],$analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + } + */ + + /** + * Test creation of delimiter analyzer + */ + public function testCreateDelimiterAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'delimiter', [ "delimiter" => " " ]); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('delimiter', $result['type']); + static::assertEquals([ "delimiter" => " " ],$analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + } + + /** + * Test creation of norm analyzer + */ + public function testCreateNormAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'norm', [ "locale" => "en.UTF-8", "accent" => false, "case" => "lower" ]); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('norm', $result['type']); + static::assertEquals([ "locale" => "en.UTF-8", "accent" => false, "case" => "lower" ],$analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + } + + /** + * Test creation of pipeline analyzer + */ + /* disabled until 3.8.1 + public function testCreatePipelineAnalyzer() + { + $data = [ "pipeline" => [ + [ "type" => "delimiter", "properties" => [ "delimiter" => " " ] ], + [ "type" => "norm", "properties" => [ "locale" => "en.UTF-8", "accent" => false, "case" => "lower" ] ], + [ "type" => "stopwords", "properties" => [ "stopwords" => ["foo", "bar", "baz", "dead"] ] ] + ] ]; + + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'pipeline', $data); + $result = $this->analyzerHandler->create($analyzer); + + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('pipeline', $result['type']); + static::assertEquals($data, $analyzer->getProperties()); + static::assertEquals([], $analyzer->getFeatures()); + } + */ /** * Test getting an analyzer From b2c1eaf44fa41be12fc10f76f2c3640e4c521efd Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 9 Jun 2021 10:37:02 +0200 Subject: [PATCH 066/101] issue #281: split OPTION_TIMEOUT into separate options OPTION_TIMEOUT is now superseded by the more specialized options - OPTION_CONNECT_TIMEOUT - OPTION_REQUEST_TIMEOUT The existing OPTION_TIMEOUT value can still be used as before. When used, it will automatically clobber values set in OPTION_CONNECT_TIMEOUT and OPTION_REQUEST_TIMEOUT. Using one of the more specialized options will remove OPTION_TIMEOUT from the connection's option. --- examples/init.php | 5 +- lib/ArangoDBClient/Connection.php | 3 +- lib/ArangoDBClient/ConnectionOptions.php | 25 ++++- lib/ArangoDBClient/DefaultValues.php | 11 ++ lib/ArangoDBClient/HttpHelper.php | 4 +- tests/ConnectionTest.php | 132 ++++++++++++++++++++++- tests/QueryTest.php | 8 +- 7 files changed, 176 insertions(+), 12 deletions(-) diff --git a/examples/init.php b/examples/init.php index 61ddc258..8a01f4db 100644 --- a/examples/init.php +++ b/examples/init.php @@ -59,8 +59,9 @@ // in order to use an externally generated JWT, there is no need to specify user and passwd, but just the JWT value: // ConnectionOptions::OPTION_AUTH_JWT => '', // use an externally generated JWT for authorization - ConnectionOptions::OPTION_TIMEOUT => 30, // timeout in seconds - // ConnectionOptions::OPTION_TRACE => $traceFunc, // tracer function, can be used for debugging + ConnectionOptions::OPTION_CONNECT_TIMEOUT => 10, // connect timeout in seconds + ConnectionOptions::OPTION_REQUEST_TIMEOUT => 30, // request timeout in seconds + // ConnectionOptions::OPTION_TRACE => $traceFunc, // tracer function, can be used for debugging ConnectionOptions::OPTION_CREATE => false, // do not create unknown collections automatically ConnectionOptions::OPTION_UPDATE_POLICY => UpdatePolicy::LAST, // last update wins ]; diff --git a/lib/ArangoDBClient/Connection.php b/lib/ArangoDBClient/Connection.php index ef4db507..ebbc89fc 100644 --- a/lib/ArangoDBClient/Connection.php +++ b/lib/ArangoDBClient/Connection.php @@ -151,7 +151,8 @@ public function setOption($name, $value) $this->_options[$name] = $value; // special handling for several options - if ($name === ConnectionOptions::OPTION_TIMEOUT) { + if ($name === ConnectionOptions::OPTION_TIMEOUT || + $name === ConnectionOptions::OPTION_REQUEST_TIMEOUT) { // set the timeout option: patch the stream of an existing connection if (is_resource($this->_handle)) { stream_set_timeout($this->_handle, $value); diff --git a/lib/ArangoDBClient/ConnectionOptions.php b/lib/ArangoDBClient/ConnectionOptions.php index 511225dd..a1bd61ae 100644 --- a/lib/ArangoDBClient/ConnectionOptions.php +++ b/lib/ArangoDBClient/ConnectionOptions.php @@ -66,9 +66,20 @@ class ConnectionOptions implements \ArrayAccess /** * Timeout value index constant + * @deprecated superseded by OPTION_CONNECT_TIMEOUT and OPTION_REQUEST_TIMEOUT */ const OPTION_TIMEOUT = 'timeout'; + /** + * Connect timeout value index constant + */ + const OPTION_CONNECT_TIMEOUT = 'connectTimeout'; + + /** + * Request timeout value index constant + */ + const OPTION_REQUEST_TIMEOUT = 'requestTimeout'; + /** * Number of servers tried in case of failover * if set to 0, then an unlimited amount of servers will be tried @@ -293,6 +304,11 @@ public function getAll() public function offsetSet($offset, $value) { $this->_values[$offset] = $value; + if ($offset === self::OPTION_CONNECT_TIMEOUT || $offset === self::OPTION_REQUEST_TIMEOUT) { + // special handling for OPTION_TIMEOUT: it will be removed once + // a more specialized option is used + unset($this->_values[self::OPTION_TIMEOUT]); + } $this->validate(); } @@ -439,7 +455,8 @@ private static function getDefaults() self::OPTION_PORT => DefaultValues::DEFAULT_PORT, self::OPTION_FAILOVER_TRIES => DefaultValues::DEFAULT_FAILOVER_TRIES, self::OPTION_FAILOVER_TIMEOUT => DefaultValues::DEFAULT_FAILOVER_TIMEOUT, - self::OPTION_TIMEOUT => DefaultValues::DEFAULT_TIMEOUT, + self::OPTION_CONNECT_TIMEOUT => DefaultValues::DEFAULT_CONNECT_TIMEOUT, + self::OPTION_REQUEST_TIMEOUT => DefaultValues::DEFAULT_REQUEST_TIMEOUT, self::OPTION_MEMCACHED_PERSISTENT_ID => 'arangodb-php-pool', self::OPTION_MEMCACHED_OPTIONS => [ ], self::OPTION_MEMCACHED_ENDPOINTS_KEY => 'arangodb-php-endpoints', @@ -575,6 +592,12 @@ private function validate() ) ); } + + if (isset($this->_values[self::OPTION_TIMEOUT])) { + // propagate values from OPTION_TIMOEUT into OPTION_CONNECT_TIMEOUT and OPTION_REQUEST_TIMEOUT + $this->_values[self::OPTION_CONNECT_TIMEOUT] = (float) $this->_values[self::OPTION_TIMEOUT]; + $this->_values[self::OPTION_REQUEST_TIMEOUT] = (float) $this->_values[self::OPTION_TIMEOUT]; + } UpdatePolicy::validate($this->_values[self::OPTION_UPDATE_POLICY]); UpdatePolicy::validate($this->_values[self::OPTION_REPLACE_POLICY]); diff --git a/lib/ArangoDBClient/DefaultValues.php b/lib/ArangoDBClient/DefaultValues.php index 84b34dde..d9d0a798 100644 --- a/lib/ArangoDBClient/DefaultValues.php +++ b/lib/ArangoDBClient/DefaultValues.php @@ -27,9 +27,20 @@ abstract class DefaultValues /** * Default timeout value (used if no timeout value specified) + * @deprecated superseded by DEFAULT_CONNECT_TIMEOUT and DEFAULT_REQUEST_TIMEOUT */ const DEFAULT_TIMEOUT = 30; + /** + * Default connect timeout value (used if no timeout value specified) + */ + const DEFAULT_CONNECT_TIMEOUT = 30; + + /** + * Default request timeout value (used if no timeout value specified) + */ + const DEFAULT_REQUEST_TIMEOUT = 30; + /** * Default number of failover servers to try (used in case there is an automatic failover) * if set to 0, then an unlimited amount of servers will be tried diff --git a/lib/ArangoDBClient/HttpHelper.php b/lib/ArangoDBClient/HttpHelper.php index 7395e5fe..8ef9e67c 100644 --- a/lib/ArangoDBClient/HttpHelper.php +++ b/lib/ArangoDBClient/HttpHelper.php @@ -104,7 +104,7 @@ public static function createConnection(ConnectionOptions $options) Endpoint::normalize($endpoint), $errNo, $message, - $options[ConnectionOptions::OPTION_TIMEOUT], + $options[ConnectionOptions::OPTION_CONNECT_TIMEOUT], STREAM_CLIENT_CONNECT, $context ); @@ -116,7 +116,7 @@ public static function createConnection(ConnectionOptions $options) ); } - stream_set_timeout($fp, $options[ConnectionOptions::OPTION_TIMEOUT]); + stream_set_timeout($fp, $options[ConnectionOptions::OPTION_REQUEST_TIMEOUT]); return $fp; } diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index 64abc0b8..ebce4f6a 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -152,7 +152,7 @@ public function testGetStatus() $response = $connection->get('/_admin/statistics'); static::assertEquals(200, $response->getHttpCode(), 'Did not return http code 200'); } - + /** * Test get options */ @@ -208,6 +208,78 @@ public function testSetOptions() $value = $connection->getOption(ConnectionOptions::OPTION_RECONNECT); static::assertFalse($value); } + + /** + * Test timeout options handling + */ + public function testTimeoutOptions() + { + $connection = getConnection(); + + $oldTimeout = $connection->getOption(ConnectionOptions::OPTION_TIMEOUT); + $oldConnectTimeout = $connection->getOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT); + $oldRequestTimeout = $connection->getOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT); + + static::assertEquals($oldTimeout, $oldConnectTimeout); + static::assertEquals($oldTimeout, $oldRequestTimeout); + + $connection->setOption(ConnectionOptions::OPTION_TIMEOUT, 12); + $newTimeout = $connection->getOption(ConnectionOptions::OPTION_TIMEOUT); + $newConnectTimeout = $connection->getOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT); + $newRequestTimeout = $connection->getOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT); + + static::assertEquals(12, $newTimeout); + static::assertEquals(12, $newConnectTimeout); + static::assertEquals(12, $newRequestTimeout); + + $connection->setOption(ConnectionOptions::OPTION_TIMEOUT, 42); + $newTimeout = $connection->getOption(ConnectionOptions::OPTION_TIMEOUT); + $newConnectTimeout = $connection->getOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT); + $newRequestTimeout = $connection->getOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT); + + static::assertEquals(42, $newTimeout); + static::assertEquals(42, $newConnectTimeout); + static::assertEquals(42, $newRequestTimeout); + + $connection->setOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT, 1.5); + try { + $connection->getOption(ConnectionOptions::OPTION_TIMEOUT); + static::assertFalse(true); + } catch (\Exception $e) { + // OPTION_TIMEOUT is gone once OPTION_CONNECT_TIMEOUT is used + } + + $newConnectTimeout = $connection->getOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT); + $newRequestTimeout = $connection->getOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT); + + static::assertEquals(1.5, $newConnectTimeout); + static::assertEquals(42, $newRequestTimeout); + + $connection->setOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT, 24.5); + $newConnectTimeout = $connection->getOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT); + $newRequestTimeout = $connection->getOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT); + + try { + $connection->getOption(ConnectionOptions::OPTION_TIMEOUT); + static::assertFalse(true); + } catch (\Exception $e) { + // OPTION_TIMEOUT is gone once OPTION_REQUEST_TIMEOUT is used + } + + static::assertEquals(1.5, $newConnectTimeout); + static::assertEquals(24.5, $newRequestTimeout); + + + $connection->setOption(ConnectionOptions::OPTION_TIMEOUT, 8); + $newTimeout = $connection->getOption(ConnectionOptions::OPTION_TIMEOUT); + $newConnectTimeout = $connection->getOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT); + $newRequestTimeout = $connection->getOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT); + + static::assertEquals(8, $newTimeout); + static::assertEquals(8, $newConnectTimeout); + static::assertEquals(8, $newRequestTimeout); + } + /** * Test set invalid options @@ -340,7 +412,7 @@ public function testSetTimeoutException() throw $exception; } } - + /** * Test timeout, no exception */ @@ -356,6 +428,62 @@ public function testSetTimeout() $cursor = $statement->execute(); static::assertCount(1, $cursor->getAll()); } + + /** + * Test connect timeout, no exception + */ + public function testSetConnectTimeout() + { + $connection = getConnection(); + $connection->setOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT, 5); + $query = 'RETURN SLEEP(1)'; + + $statement = new Statement($connection, ['query' => $query]); + + // should work + $cursor = $statement->execute(); + static::assertCount(1, $cursor->getAll()); + } + + /** + * Test request timeout exception + * + * @expectedException \ArangoDBClient\ClientException + */ + public function testSetRequestTimeoutException() + { + $connection = getConnection(); + $connection->setOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT, 3); + $connection->setOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT, 2); + $query = 'RETURN SLEEP(3)'; + + $statement = new Statement($connection, ['query' => $query]); + + try { + // this is expected to fail + $statement->execute(); + } catch (ClientException $exception) { + static::assertEquals(408, $exception->getCode()); + throw $exception; + } + } + + /** + * Test request timeout, no exception + */ + public function testSetRequestTimeout() + { + $connection = getConnection(); + $connection->setOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT, 5); + $connection->setOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT, 5); + $query = 'RETURN SLEEP(1)'; + + $statement = new Statement($connection, ['query' => $query]); + + // should work + $cursor = $statement->execute(); + static::assertCount(1, $cursor->getAll()); + } /** * Test "connection: close" diff --git a/tests/QueryTest.php b/tests/QueryTest.php index f9c1c1b7..ab3922a9 100644 --- a/tests/QueryTest.php +++ b/tests/QueryTest.php @@ -124,17 +124,17 @@ public function testGetSlow() */ public function testTimeoutException() { - $old = $this->connection->getOption(ConnectionOptions::OPTION_TIMEOUT); - $this->connection->setOption(ConnectionOptions::OPTION_TIMEOUT, 10); + $old = $this->connection->getOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT); + $this->connection->setOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT, 10); $query = 'RETURN SLEEP(13)'; $statement = new Statement($this->connection, ['query' => $query]); try { $statement->execute(); - $this->connection->setOption(ConnectionOptions::OPTION_TIMEOUT, $old); + $this->connection->setOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT, $old); } catch (ClientException $exception) { - $this->connection->setOption(ConnectionOptions::OPTION_TIMEOUT, $old); + $this->connection->setOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT, $old); static::assertEquals($exception->getCode(), 408); throw $exception; } From cbd2e440fc86fb46da5227240d0bcbe170585271 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 9 Jun 2021 21:22:57 +0200 Subject: [PATCH 067/101] issue #282: add extra length check (#285) work around short/truncated reads by adding an extra length check rather than assuming the read string already has a specific length --- lib/ArangoDBClient/HttpHelper.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/ArangoDBClient/HttpHelper.php b/lib/ArangoDBClient/HttpHelper.php index 8ef9e67c..e768f601 100644 --- a/lib/ArangoDBClient/HttpHelper.php +++ b/lib/ArangoDBClient/HttpHelper.php @@ -255,7 +255,10 @@ public static function transfer($socket, $request, $method) // 12 = minimum offset (i.e. strlen("HTTP/1.1 xxx") - // after that we could see "content-length:" - $pos = stripos($result, 'content-length: ', 12); + $pos = false; + if (strlen($result) > 12) { + $pos = stripos($result, 'content-length: ', 12); + } if ($pos !== false) { $contentLength = (int) substr($result, $pos + 16, 10); // 16 = strlen("content-length: ") From e97c135de8f9563b5fa8e7d8973ca09f298f0fd1 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 9 Jun 2021 21:25:22 +0200 Subject: [PATCH 068/101] issue #269: Undefined index: revision (#284) Fix an undefined index notice/warning when calling the DocumentHandler::put function with a `revision` option set. --- lib/ArangoDBClient/DocumentHandler.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index 948dc512..2024e269 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -757,9 +757,10 @@ protected function put($url, $collection, $documentId, Document $document, array if (isset($params[ConnectionOptions::OPTION_REPLACE_POLICY]) && $params[ConnectionOptions::OPTION_REPLACE_POLICY] === UpdatePolicy::ERROR ) { - if (null !== $options['revision']) { + $revision = $document->getRevision(); + if (null !== $revision) { $params['ignoreRevs'] = false; - $headers['if-match'] = '"' . $options['revision'] . '"'; + $headers['if-match'] = '"' . $revision . '"'; } } From c6339cc20f6b6744fba7c5e426edd261244d71d0 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 9 Jun 2021 21:28:48 +0200 Subject: [PATCH 069/101] fix test failure in devel --- tests/CollectionExtendedTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/CollectionExtendedTest.php b/tests/CollectionExtendedTest.php index 76455bbb..7bc7ea8b 100644 --- a/tests/CollectionExtendedTest.php +++ b/tests/CollectionExtendedTest.php @@ -115,7 +115,8 @@ public function testCreateWithSchema() ], "additionalProperties" => false ], - "message" => "Schema validation failed" + "message" => "Schema validation failed", + "type" => "json" ]; $collection->setSchema($schema); From 251f968fa5c5e6bc52901ede321fbd99b0e7d5be Mon Sep 17 00:00:00 2001 From: jsteemann Date: Sat, 12 Jun 2021 20:53:31 +0200 Subject: [PATCH 070/101] try to use php-8 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6e985cd2..5d6aeecc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ matrix: - php: '7.2' - php: '7.3' - php: '7.4' + - php: '8.0' allow_failures: - php: hhvm From 27dc6b3b4fd04895e7fa23bd032a097a61fafd91 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Sat, 12 Jun 2021 21:00:09 +0200 Subject: [PATCH 071/101] adjust phpunit version --- tests/travis/setup_arangodb.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index b5c54669..93d23ff9 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -32,6 +32,11 @@ wget "https://phar.phpunit.de/phpunit-6.0.phar" mv phpunit-6.0.phar ./phpunit fi +if [[ "$TRAVIS_PHP_VERSION" == "8.0" ]] ; then +wget "https://phar.phpunit.de/phpunit-9.0.phar" +mv phpunit-9.0.phar ./phpunit +fi + if [[ "$TRAVIS_PHP_VERSION" == "hhvm" ]] ; then wget "https://phar.phpunit.de/phpunit-6.0.phar" mv phpunit-6.0.phar ./phpunit From 1c1b23f3962b1698452d2e09347e005469836d71 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Sat, 12 Jun 2021 21:21:21 +0200 Subject: [PATCH 072/101] bump version of phpunit --- tests/travis/setup_arangodb.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index 93d23ff9..13cfee04 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -33,8 +33,8 @@ mv phpunit-6.0.phar ./phpunit fi if [[ "$TRAVIS_PHP_VERSION" == "8.0" ]] ; then -wget "https://phar.phpunit.de/phpunit-9.0.phar" -mv phpunit-9.0.phar ./phpunit +wget "https://phar.phpunit.de/phpunit-9.5.phar" +mv phpunit-9.5.phar ./phpunit fi if [[ "$TRAVIS_PHP_VERSION" == "hhvm" ]] ; then From 6740cc89a8c8cc1141dbcfbb5cdd9e4f72d084ae Mon Sep 17 00:00:00 2001 From: jsteemann Date: Sat, 12 Jun 2021 22:46:28 +0200 Subject: [PATCH 073/101] fix tests for new phpunit version and php8 --- lib/ArangoDBClient/Connection.php | 2 +- tests/AdminTest.php | 10 +- tests/AnalyzerTest.php | 4 +- tests/AqlUserFunctionTest.php | 4 +- tests/BatchTest.php | 4 +- tests/CollectionBasicTest.php | 4 +- tests/CollectionExtendedTest.php | 44 +-------- tests/ConnectionTest.php | 48 ++++------ tests/CustomDocumentClassTest.php | 4 +- tests/CustomEdgeClassTest.php | 4 +- tests/DatabaseTest.php | 4 +- tests/DocumentBasicTest.php | 4 +- tests/DocumentExtendedTest.php | 117 +----------------------- tests/EdgeBasicTest.php | 93 +------------------ tests/EdgeExtendedTest.php | 89 +----------------- tests/FoxxBasicTest.php | 7 +- tests/GeneralGraphExtendedTest.php | 4 +- tests/GraphBasicTest.php | 14 +-- tests/GraphExtendedTest.php | 4 +- tests/QueryCacheTest.php | 4 +- tests/QueryTest.php | 7 +- tests/StatementTest.php | 46 +--------- tests/StreamingTransactionTest.php | 4 +- tests/TransactionTest.php | 4 +- tests/TraversalTest.php | 4 +- tests/UserBasicTest.php | 4 +- tests/ViewTest.php | 4 +- tests/phpunit-connection-close.xml | 28 +++--- tests/phpunit-connection-keep-alive.xml | 28 +++--- 29 files changed, 111 insertions(+), 486 deletions(-) diff --git a/lib/ArangoDBClient/Connection.php b/lib/ArangoDBClient/Connection.php index ebbc89fc..b207e49b 100644 --- a/lib/ArangoDBClient/Connection.php +++ b/lib/ArangoDBClient/Connection.php @@ -145,7 +145,7 @@ public function setOption($name, $value) $name === ConnectionOptions::OPTION_CIPHERS || $name === ConnectionOptions::OPTION_ALLOW_SELF_SIGNED ) { - throw new ClientException('Must not set option ' . $value . ' after connection is created.'); + throw new ClientException('Must not set option ' . $name . ' after connection is created.'); } $this->_options[$name] = $value; diff --git a/tests/AdminTest.php b/tests/AdminTest.php index 32fa5ad8..1d368fa2 100644 --- a/tests/AdminTest.php +++ b/tests/AdminTest.php @@ -16,7 +16,7 @@ class AdminTest extends \PHPUnit_Framework_TestCase { - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->adminHandler = new AdminHandler($this->connection); @@ -71,10 +71,10 @@ public function testGetServerVersion() public function testGetServerVersionWithDetails() { $result = $this->adminHandler->getServerVersion(true); - static::assertInternalType('array', $result, 'The server version details must be an array!'); - static::assertInternalType( + static::assertEquals('array', gettype($result), 'The server version details must be an array!'); + static::assertEquals( 'array', - $result['details'], + gettype($result['details']), 'The server version details must have a `details` array!' ); @@ -262,7 +262,7 @@ public function testGetServerStatisticsDescription() } - public function tearDown() + public function tearDown(): void { unset($this->adminHandler, $this->connection); } diff --git a/tests/AnalyzerTest.php b/tests/AnalyzerTest.php index 5e2d7ecb..beb38ccc 100644 --- a/tests/AnalyzerTest.php +++ b/tests/AnalyzerTest.php @@ -29,7 +29,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->analyzerHandler = new AnalyzerHandler($this->connection); @@ -285,7 +285,7 @@ public function testDropNonExistingAnalyzer() static::assertEquals(404, $exception->getCode()); } - public function tearDown() + public function tearDown(): void { $this->analyzerHandler = new AnalyzerHandler($this->connection); try { diff --git a/tests/AqlUserFunctionTest.php b/tests/AqlUserFunctionTest.php index 7571b761..8e02c948 100644 --- a/tests/AqlUserFunctionTest.php +++ b/tests/AqlUserFunctionTest.php @@ -30,7 +30,7 @@ public function __construct($name = null, array $data = [], $dataName = '') static::$testsTimestamp = str_replace('.', '', (string) microtime(true)); } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); @@ -378,7 +378,7 @@ public function testUnRegisterAQLFunctionsOnNamespace() static::assertEmpty($functions, 'phpTestFunctions namespace should only contain no functions.'); } - public function tearDown() + public function tearDown(): void { $this->cleanup(); unset($this->connection); diff --git a/tests/BatchTest.php b/tests/BatchTest.php index 73355dc3..8acf118e 100644 --- a/tests/BatchTest.php +++ b/tests/BatchTest.php @@ -28,7 +28,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); @@ -614,7 +614,7 @@ public function testByExampleBatch() static::assertSame($document1->getHandle(), reset($all2)->getHandle()); } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index fb254e94..32b76928 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -27,7 +27,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -1425,7 +1425,7 @@ public function testGetResponsibleShard() } } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp); diff --git a/tests/CollectionExtendedTest.php b/tests/CollectionExtendedTest.php index 7bc7ea8b..5351fc6f 100644 --- a/tests/CollectionExtendedTest.php +++ b/tests/CollectionExtendedTest.php @@ -34,7 +34,7 @@ public function __construct($name = null, array $data = [], $dataName = '') /** * Test set-up */ - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collection = new Collection(); @@ -374,40 +374,6 @@ public function testCreateRenameAndDeleteCollection() } - /** - * test for creation, rename, and delete of a collection with wrong encoding - * - * We expect an exception here: - * - * @expectedException \ArangoDBClient\ClientException - * - */ - public function testCreateRenameAndDeleteCollectionWithWrongEncoding() - { - $collection = $this->collection; - $collectionHandler = $this->collectionHandler; - - - $name = 'ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp; - $collection->setName($name); - - $response = $collectionHandler->create($collection); - - static::assertTrue(is_numeric($response), 'Adding collection did not return an id!'); - - $resultingCollection = $collectionHandler->get($name); - - // inject wrong encoding - $isoValue = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'ArangoDB_PHP_TestSuite_TestCollection_01_renamedü'); - - static::assertTrue($collectionHandler->rename($resultingCollection, $isoValue)); - - - $response = $collectionHandler->drop($resultingCollection); - static::assertTrue($response, 'Delete should return true!'); - } - - /** * test for creation, get, and delete of a collection with waitForSync set to true */ @@ -543,11 +509,10 @@ public function testRemoveByKeys() /** * test for removal by keys with unknown collection - * - * @expectedException \ArangoDBClient\ServerException */ public function testRemoveByKeysCollectionNotFound() { + $this->expectException(\ArangoDBClient\ServerException::class); $collectionHandler = $this->collectionHandler; $keys = ['foo']; @@ -2990,11 +2955,10 @@ public function testLookupByKeys() /** * test for lookup by keys with unknown collection - * - * @expectedException \ArangoDBClient\ServerException */ public function testLookupByCollectionNotFound() { + $this->expectException(\ArangoDBClient\ServerException::class); $collectionHandler = $this->collectionHandler; $keys = ['foo']; @@ -3004,7 +2968,7 @@ public function testLookupByCollectionNotFound() /** * Test tear-down */ - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index ebce4f6a..f58c11c6 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -33,7 +33,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -283,11 +283,10 @@ public function testTimeoutOptions() /** * Test set invalid options - * - * @expectedException \ArangoDBClient\ClientException */ public function testSetEndpointOption() { + $this->expectException(\ArangoDBClient\ClientException::class); $connection = getConnection(); // will fail! @@ -296,11 +295,10 @@ public function testSetEndpointOption() /** * Test set invalid options - * - * @expectedException \ArangoDBClient\ClientException */ public function testSetAllowSelfSignedOption() { + $this->expectException(\ArangoDBClient\ClientException::class); $connection = getConnection(); // will fail! @@ -309,11 +307,10 @@ public function testSetAllowSelfSignedOption() /** * Test set invalid options - * - * @expectedException \ArangoDBClient\ClientException */ public function testSetVerifyCert() { + $this->expectException(\ArangoDBClient\ClientException::class); $connection = getConnection(); // will fail! @@ -322,11 +319,10 @@ public function testSetVerifyCert() /** * Test set invalid options - * - * @expectedException \ArangoDBClient\ClientException */ public function testSetCiphers() { + $this->expectException(\ArangoDBClient\ClientException::class); $connection = getConnection(); // will fail! @@ -335,11 +331,10 @@ public function testSetCiphers() /** * Test set invalid options - * - * @expectedException \ArangoDBClient\ClientException */ public function testSetHostOption() { + $this->expectException(\ArangoDBClient\ClientException::class); $connection = getConnection(); // will fail! @@ -348,11 +343,10 @@ public function testSetHostOption() /** * Test set invalid options - * - * @expectedException \ArangoDBClient\ClientException */ public function testSetPortOption() { + $this->expectException(\ArangoDBClient\ClientException::class); $connection = getConnection(); // will fail! @@ -393,11 +387,10 @@ public function testGetSetDatabase() /** * Test timeout exception - * - * @expectedException \ArangoDBClient\ClientException */ public function testSetTimeoutException() { + $this->expectException(\ArangoDBClient\ClientException::class); $connection = getConnection(); $connection->setOption(ConnectionOptions::OPTION_TIMEOUT, 3); $query = 'RETURN SLEEP(6)'; @@ -447,11 +440,10 @@ public function testSetConnectTimeout() /** * Test request timeout exception - * - * @expectedException \ArangoDBClient\ClientException */ public function testSetRequestTimeoutException() { + $this->expectException(\ArangoDBClient\ClientException::class); $connection = getConnection(); $connection->setOption(ConnectionOptions::OPTION_CONNECT_TIMEOUT, 3); $connection->setOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT, 2); @@ -583,7 +575,7 @@ public function testBasicTracer() ['send', 'receive'], 'Basic tracer\'s type should only be \'send\' or \'receive\'' ); - static::assertInternalType('string', $data, 'Basic tracer data is not a string!.'); + static::assertEquals('string', gettype($data), 'Basic tracer data is not a string!.'); }; $options = getConnectionOptions(); @@ -614,9 +606,9 @@ public function testEnhancedTracer() '$data must be instance of TraceRequest or TraceResponse.' ); - static::assertInternalType('array', $data->getHeaders(), 'Headers should be an array!'); + static::assertEquals('array', gettype($data->getHeaders()), 'Headers should be an array!'); static::assertNotEmpty($data->getHeaders(), 'Headers should not be an empty array!'); - static::assertInternalType('string', $data->getBody(), 'Body must be a string!'); + static::assertEquals('string', gettype($data->getBody()), 'Body must be a string!'); if ($data instanceof TraceRequest) { static::assertContains( @@ -632,22 +624,22 @@ public function testEnhancedTracer() 'Invalid http method!' ); - static::assertInternalType('string', $data->getRequestUrl(), 'Request url must be a string!'); + static::assertEquals('string', gettype($data->getRequestUrl()), 'Request url must be a string!'); static::assertEquals('request', $data->getType()); foreach ($data->getHeaders() as $header => $value) { - static::assertInternalType('string', $value, 'The header value should be a string'); - static::assertInternalType('string', $header, 'The header should be a string'); + static::assertEquals('string', gettype($value), 'The header value should be a string'); + static::assertEquals('string', gettype($header), 'The header should be a string'); } } else { - static::assertInternalType('integer', $data->getHttpCode(), 'Http code must be an integer!'); - static::assertInternalType( + static::assertEquals('integer', gettype($data->getHttpCode()), 'Http code must be an integer!'); + static::assertEquals( 'string', - $data->getHttpCodeDefinition(), + gettype($data->getHttpCodeDefinition()), 'Http code definition must be a string!' ); static::assertEquals('response', $data->getType()); - static::assertInternalType('float', $data->getTimeTaken()); + static::assertIsFloat($data->getTimeTaken()); } }; @@ -668,7 +660,7 @@ public function testEnhancedTracer() } } - public function tearDown() + public function tearDown(): void { unset($this->connection); diff --git a/tests/CustomDocumentClassTest.php b/tests/CustomDocumentClassTest.php index b3e3552a..81a7cb2c 100644 --- a/tests/CustomDocumentClassTest.php +++ b/tests/CustomDocumentClassTest.php @@ -33,7 +33,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -163,7 +163,7 @@ public function testGetCustomDocumentWithBatch() } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/CustomEdgeClassTest.php b/tests/CustomEdgeClassTest.php index 39f20885..a1bc1129 100644 --- a/tests/CustomEdgeClassTest.php +++ b/tests/CustomEdgeClassTest.php @@ -33,7 +33,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -98,7 +98,7 @@ public function testGetCustomEdgeWithHandler() $edgeHandler->remove($edge); } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/DatabaseTest.php b/tests/DatabaseTest.php index d94ffd1b..d2621a07 100644 --- a/tests/DatabaseTest.php +++ b/tests/DatabaseTest.php @@ -29,7 +29,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->connection->setDatabase('_system'); @@ -349,7 +349,7 @@ public function testCreateDatabaseSwitchToItAndCreateAnotherOne() ); } - public function tearDown() + public function tearDown(): void { $this->connection->setDatabase('_system'); diff --git a/tests/DocumentBasicTest.php b/tests/DocumentBasicTest.php index ea87a47f..28b28217 100644 --- a/tests/DocumentBasicTest.php +++ b/tests/DocumentBasicTest.php @@ -32,7 +32,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -1026,7 +1026,7 @@ public function testHasDocumentReturnsTrueIfDocumentExists() } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/DocumentExtendedTest.php b/tests/DocumentExtendedTest.php index 810eec41..8d222744 100644 --- a/tests/DocumentExtendedTest.php +++ b/tests/DocumentExtendedTest.php @@ -32,7 +32,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -43,34 +43,6 @@ public function setUp() } - /** - * test for creation of document with non utf encoding. This tests for failure of such an action. - * We expect an exception here: - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testCreateDocumentWithWrongEncoding() - { - $documentHandler = $this->documentHandler; - $isoKey = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'someWrongEncodedAttribute'); - $isoValue = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'someWrongEncodedValueü'); - - $document = Document::createFromArray([$isoKey => $isoValue, 'someOtherAttribute' => 'someOtherValue']); - $documentId = $documentHandler->save($this->collection->getName(), $document); - - static::assertTrue(is_numeric($documentId), 'Did not return an id!'); - - $resultingDocument = $documentHandler->get($this->collection->getName(), $documentId); - - static::assertObjectHasAttribute('_id', $resultingDocument, '_id field should exist, empty or with an id'); - static::assertEquals('someValue', $resultingDocument->someAttribute); - static::assertEquals('someOtherValue', $resultingDocument->someOtherAttribute); - - $response = $documentHandler->remove($document); - static::assertTrue($response, 'Delete should return true!'); - } - - /** * test for creation, get, and delete of a document given its settings through createFrom[] */ @@ -279,49 +251,6 @@ public function testUpdateDocument() } - /** - * test for updating a document using update() with wrong encoding - * We expect an exception here: - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testUpdateDocumentWithWrongEncoding() - { - $documentHandler = $this->documentHandler; - - $document = Document::createFromArray( - ['someAttribute' => 'someValue', 'someOtherAttribute' => 'someOtherValue'] - ); - $documentId = $documentHandler->save($this->collection->getName(), $document); - $documentHandler->get($this->collection->getName(), $documentId); - @list(, $documentId) = explode('/', $documentId); - static::assertTrue(is_numeric($documentId), 'Did not return an id!'); - - $patchDocument = new Document(); - $patchDocument->set('_id', $document->getHandle()); - $patchDocument->set('_rev', $document->getRevision()); - - // inject wrong encoding - $isoValue = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'someWrongEncodedValueü'); - - $patchDocument->set('someOtherAttribute', $isoValue); - $result = $documentHandler->update($patchDocument); - - static::assertTrue($result); - - $resultingDocument = $documentHandler->get($this->collection->getName(), $documentId); - static::assertObjectHasAttribute('_id', $resultingDocument, '_id field should exist, empty or with an id'); - - static::assertEquals( - 'someValue', $resultingDocument->someAttribute, 'Should be :someValue, is: ' . $resultingDocument->someAttribute - ); - static::assertEquals( - 'someOtherValue2', $resultingDocument->someOtherAttribute, 'Should be :someOtherValue2, is: ' . $resultingDocument->someOtherAttribute - ); - $response = $documentHandler->remove($resultingDocument); - static::assertTrue($response, 'Delete should return true!'); - } - /** * test for updating a document using update() */ @@ -530,48 +459,6 @@ public function testReplaceDocument() } - /** - * test for replacing a document using replace() with wrong encoding - * We expect an exception here: - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testReplaceDocumentWithWrongEncoding() - { - $documentHandler = $this->documentHandler; - - $document = Document::createFromArray( - ['someAttribute' => 'someValue', 'someOtherAttribute' => 'someOtherValue'] - ); - $documentId = $documentHandler->save($this->collection->getName(), $document); - - @list(, $documentId) = explode('/', $documentId); - static::assertTrue(is_numeric($documentId), 'Did not return an id!'); - - // inject wrong encoding - $isoKey = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'someWrongEncododedAttribute'); - $isoValue = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'someWrongEncodedValueü'); - - $document->set($isoKey, $isoValue); - $document->set('someOtherAttribute', 'someOtherValue2'); - $result = $documentHandler->replace($document); - - static::assertTrue($result); - $resultingDocument = $documentHandler->get($this->collection->getName(), $documentId); - - static::assertObjectHasAttribute('_id', $resultingDocument, '_id field should exist, empty or with an id'); - - static::assertEquals( - 'someValue2', $resultingDocument->someAttribute, 'Should be :someValue2, is: ' . $resultingDocument->someAttribute - ); - static::assertEquals( - 'someOtherValue2', $resultingDocument->someOtherAttribute, 'Should be :someOtherValue2, is: ' . $resultingDocument->someOtherAttribute - ); - - $response = $documentHandler->remove($resultingDocument); - static::assertTrue($response, 'Delete should return true!'); - } - /** * test for replacing a document using returnOld/returnNew */ @@ -1328,7 +1215,7 @@ public function testStoreNewDocumentThenReplace() static::assertNotEquals($rev, $document->getRevision(), 'Revision matches when it is not suppose to.'); } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/EdgeBasicTest.php b/tests/EdgeBasicTest.php index ff18cf67..b7d48557 100644 --- a/tests/EdgeBasicTest.php +++ b/tests/EdgeBasicTest.php @@ -32,7 +32,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -268,95 +268,6 @@ public function testCreateAndDeleteEdgeWithoutCreatedEdgeCollection() } - /** - * Try to create and delete an edge with wrong encoding - * We expect an exception here: - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testCreateAndDeleteEdgeWithWrongEncoding() - { - $connection = $this->connection; - $this->collection; - $edgeCollection = $this->edgeCollection; - $this->collectionHandler; - - $document1 = new Document(); - $document2 = new Document(); - $documentHandler = new DocumentHandler($connection); - - $edgeDocument = new Edge(); - $edgeDocumentHandler = new EdgeHandler($connection); - - $document1->someAttribute = 'someValue1'; - $document2->someAttribute = 'someValue2'; - - - $documentHandler->save('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp, $document1); - $documentHandler->save('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp, $document2); - $documentHandle1 = $document1->getHandle(); - $documentHandle2 = $document2->getHandle(); - - $isoValue = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'knowsü'); - $edgeDocument->set('label', $isoValue); - - $edgeDocumentId = $edgeDocumentHandler->saveEdge( - $edgeCollection->getId(), - $documentHandle1, - $documentHandle2, - $edgeDocument - ); - - // $resultingDocument = $documentHandler->get($edgeCollection->getId(), $edgeDocumentId); - - $resultingEdge = $edgeDocumentHandler->get($edgeCollection->getId(), $edgeDocumentId); - - $resultingAttribute = $resultingEdge->label; - static::assertSame('knows', $resultingAttribute, 'Attribute set on the Edge is different from the one retrieved!'); - - - $edgesQuery1Result = $edgeDocumentHandler->edges($edgeCollection->getId(), $documentHandle1, 'out'); - - static::assertCount(2, $edgesQuery1Result); - - $statement = new Statement( - $connection, [ - 'query' => '', - 'count' => true, - 'batchSize' => 1000, - 'sanitize' => true, - ] - ); - $statement->setQuery( - 'FOR p IN PATHS(ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp . ', ArangoDB_PHP_TestSuite_TestEdgeCollection_01' . '_' . static::$testsTimestamp . ', "outbound") RETURN p' - ); - $cursor = $statement->execute(); - - $result = $cursor->current(); - static::assertInstanceOf( - Document::class, - $result, - 'IN PATHS statement did not return a document object!' - ); - $resultingEdge->set('label', 'knows not'); - - $documentHandler->update($resultingEdge); - - - $resultingEdge = $edgeDocumentHandler->get($edgeCollection->getId(), $edgeDocumentId); - $resultingAttribute = $resultingEdge->label; - static::assertSame( - 'knows not', $resultingAttribute, 'Attribute "knows not" set on the Edge is different from the one retrieved (' . $resultingAttribute . ')!' - ); - - - $documentHandler->remove($document1); - $documentHandler->remove($document2); - - // On ArangoDB 1.0 deleting a vertex doesn't delete the associated edge. Caution! - $edgeDocumentHandler->remove($resultingEdge); - } - /** * Try to create, get and delete a edge using the revision- */ @@ -884,7 +795,7 @@ public function testEdgesBatched() static::assertCount(0, $edgesQueryResult); } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestEdgeCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/EdgeExtendedTest.php b/tests/EdgeExtendedTest.php index 5a0527c1..7cc472f7 100644 --- a/tests/EdgeExtendedTest.php +++ b/tests/EdgeExtendedTest.php @@ -33,7 +33,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -198,49 +198,6 @@ public function testUpdateEdge() } - /** - * test for updating a edge using update() with wrong encoding - * We expect an exception here: - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testUpdateEdgeWithWrongEncoding() - { - $edgeHandler = $this->edgeHandler; - - $edge = Edge::createFromArray( - ['someAttribute' => 'someValue', 'someOtherAttribute' => 'someOtherValue'] - ); - $edgeId = $edgeHandler->save($this->collection->getId(), $edge); - $edgeHandler->get($this->collection->getId(), $edgeId); - static::assertTrue(is_numeric($edgeId), 'Did not return an id!'); - - $patchEdge = new Edge(); - $patchEdge->set('_id', $edge->getHandle()); - $patchEdge->set('_rev', $edge->getRevision()); - - // inject wrong encoding - $isoValue = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'someWrongEncodedValueü'); - - $patchEdge->set('someOtherAttribute', $isoValue); - $result = $edgeHandler->update($patchEdge); - - static::assertTrue($result); - - $resultingEdge = $edgeHandler->get($this->collection->getId(), $edgeId); - static::assertObjectHasAttribute('_id', $resultingEdge, '_id field should exist, empty or with an id'); - - static::assertEquals( - 'someValue', $resultingEdge->someAttribute, 'Should be :someValue, is: ' . $resultingEdge->someAttribute - ); - static::assertEquals( - 'someOtherValue2', $resultingEdge->someOtherAttribute, 'Should be :someOtherValue2, is: ' . $resultingEdge->someOtherAttribute - ); - $response = $edgeHandler->remove($resultingEdge); - static::assertTrue($response, 'Delete should return true!'); - } - - /** * test for updating a edge using update() */ @@ -365,49 +322,7 @@ public function testReplaceEdge() } - /** - * test for replacing a edge using replace() with wrong encoding - * We expect an exception here: - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testReplaceEdgeWithWrongEncoding() - { - $edgeHandler = $this->edgeHandler; - - $edge = Edge::createFromArray( - ['someAttribute' => 'someValue', 'someOtherAttribute' => 'someOtherValue'] - ); - $edgeId = $edgeHandler->save($this->collection->getId(), $edge); - - static::assertTrue(is_numeric($edgeId), 'Did not return an id!'); - - // inject wrong encoding - $isoKey = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'someWrongEncodedAttribute'); - $isoValue = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', 'someWrongEncodedValueü'); - - $edge->set($isoKey, $isoValue); - $edge->set('someOtherAttribute', 'someOtherValue2'); - $result = $edgeHandler->replace($edge); - - static::assertTrue($result); - $resultingEdge = $edgeHandler->get($this->collection->getId(), $edgeId); - - static::assertObjectHasAttribute('_id', $resultingEdge, '_id field should exist, empty or with an id'); - - static::assertEquals( - 'someValue2', $resultingEdge->someAttribute, 'Should be :someValue2, is: ' . $resultingEdge->someAttribute - ); - static::assertEquals( - 'someOtherValue2', $resultingEdge->someOtherAttribute, 'Should be :someOtherValue2, is: ' . $resultingEdge->someOtherAttribute - ); - - $response = $edgeHandler->remove($resultingEdge); - static::assertTrue($response, 'Delete should return true!'); - } - - - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestEdgeCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/FoxxBasicTest.php b/tests/FoxxBasicTest.php index 4e8c7e65..62f7e24a 100644 --- a/tests/FoxxBasicTest.php +++ b/tests/FoxxBasicTest.php @@ -21,7 +21,7 @@ class FoxxBasicTest extends \PHPUnit_Framework_TestCase { - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->foxxHandler = new FoxxHandler($this->connection); @@ -49,18 +49,17 @@ public function testUploadAndInstallFoxxApp() /** * Try to upload and install a non-existing app - * - * @expectedException \ArangoDBClient\ClientException */ public function testUploadAndInstallNonExistingFoxxApp() { + $this->expectException(\ArangoDBClient\ClientException::class); $foxxHandler = $this->foxxHandler; $zip = __DIR__ . '/files_for_tests/move_along.zip'; $foxxHandler->installFoxxZip($zip, '/move_along'); } - public function tearDown() + public function tearDown(): void { $foxxHandler = $this->foxxHandler; try { diff --git a/tests/GeneralGraphExtendedTest.php b/tests/GeneralGraphExtendedTest.php index b2443faa..29404e5d 100644 --- a/tests/GeneralGraphExtendedTest.php +++ b/tests/GeneralGraphExtendedTest.php @@ -29,7 +29,7 @@ public function __construct($name = null, array $data = [], $dataName = '') static::$testsTimestamp = str_replace('.', '_', (string) microtime(true)); } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $v = time(); @@ -383,7 +383,7 @@ public function testsaveGetUpdateReplaceRemoveEdge() } - public function tearDown() + public function tearDown(): void { try { $result = $this->graphHandler->dropGraph($this->graphName); diff --git a/tests/GraphBasicTest.php b/tests/GraphBasicTest.php index ee50305a..32f6980e 100644 --- a/tests/GraphBasicTest.php +++ b/tests/GraphBasicTest.php @@ -35,7 +35,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -212,7 +212,7 @@ public function testAddGetDeleteCollections() } catch (\Exception $e) { $error = $e->getMessage(); } - static::assertRegExp('/orphan collection/', $error); + static::assertMatchesRegularExpression('/orphan collection/', $error); $error = null; try { @@ -221,7 +221,7 @@ public function testAddGetDeleteCollections() $error = $e->getMessage(); } - static::assertRegExp('/not a vertex collection/', $error); + static::assertMatchesRegularExpression('/not a vertex collection/', $error); $error = null; try { @@ -292,7 +292,7 @@ public function testAddGetDeleteCollectionsWithCache() } catch (\Exception $e) { $error = $e->getMessage(); } - static::assertRegExp('/orphan collection/', $error); + static::assertMatchesRegularExpression('/orphan collection/', $error); $error = null; try { @@ -300,7 +300,7 @@ public function testAddGetDeleteCollectionsWithCache() } catch (\Exception $e) { $error = $e->getMessage(); } - static::assertRegExp('/not a vertex collection/', $error); + static::assertMatchesRegularExpression('/not a vertex collection/', $error); $error = null; try { @@ -349,7 +349,7 @@ public function testAddGetDeleteEdgeCollections() } catch (\Exception $e) { $error = $e->getMessage(); } - static::assertContains('multi use of edge collection in edge def', $error); + static::assertStringContainsString('multi use of edge collection in edge def', $error); $error = null; try { $this->graph = $this->graphHandler->getEdgeCollections('bla' . '_' . static::$testsTimestamp); @@ -402,7 +402,7 @@ public function testAddGetDeleteEdgeCollections() } - public function tearDown() + public function tearDown(): void { $this->graphHandler = new GraphHandler($this->connection); try { diff --git a/tests/GraphExtendedTest.php b/tests/GraphExtendedTest.php index dec6b82e..4e090344 100644 --- a/tests/GraphExtendedTest.php +++ b/tests/GraphExtendedTest.php @@ -59,7 +59,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->vertex1Name = 'vertex1'; $this->vertex2Name = 'vertex2'; @@ -1207,7 +1207,7 @@ public function testHasEdgeReturnsTrueIfExists() static::assertTrue($result); } - public function tearDown() + public function tearDown(): void { try { $result = $this->graphHandler->dropGraph($this->graphName); diff --git a/tests/QueryCacheTest.php b/tests/QueryCacheTest.php index d8d7fd36..42ad01a8 100644 --- a/tests/QueryCacheTest.php +++ b/tests/QueryCacheTest.php @@ -29,7 +29,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->cacheHandler = new QueryCacheHandler($this->connection); @@ -337,7 +337,7 @@ public function testDemandModeUnused() } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection' . '_' . static::$testsTimestamp); diff --git a/tests/QueryTest.php b/tests/QueryTest.php index ab3922a9..e86b2264 100644 --- a/tests/QueryTest.php +++ b/tests/QueryTest.php @@ -29,7 +29,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->queryHandler = new QueryHandler($this->connection); @@ -119,11 +119,10 @@ public function testGetSlow() /** * Test getting correct Timeout Exception - * - * @expectedException \ArangoDBClient\ClientException */ public function testTimeoutException() { + $this->expectException(\ArangoDBClient\ClientException::class); $old = $this->connection->getOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT); $this->connection->setOption(ConnectionOptions::OPTION_REQUEST_TIMEOUT, 10); $query = 'RETURN SLEEP(13)'; @@ -141,7 +140,7 @@ public function testTimeoutException() } - public function tearDown() + public function tearDown(): void { unset($this->queryHandler, $this->connection); } diff --git a/tests/StatementTest.php b/tests/StatementTest.php index 7961fea7..51360397 100644 --- a/tests/StatementTest.php +++ b/tests/StatementTest.php @@ -41,7 +41,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -311,48 +311,6 @@ public function testStatisticsSelect() static::assertEquals(500, $cursor->getFiltered()); } - /** - * This is just a test to really test connectivity with the server before moving on to further tests. - * We expect an exception here: - * - * @expectedException \ArangoDBClient\ClientException - */ - public function testExecuteStatementWithWrongEncoding() - { - $connection = $this->connection; - $collection = $this->collection; - $document = new Document(); - $documentHandler = new DocumentHandler($connection); - - $document->someAttribute = 'someValue'; - - $documentHandler->save($collection->getName(), $document); - - $statement = new Statement( - $connection, [ - 'query' => '', - 'count' => true, - 'batchSize' => 1000, - '_sanitize' => true, - ] - ); - // inject wrong encoding - $isoValue = iconv( - 'UTF-8', - 'ISO-8859-1//TRANSLIT', - '\'FOR ü IN `ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp . '` RETURN ü' - ); - - $statement->setQuery($isoValue); - $cursor = $statement->execute(); - - $result = $cursor->current(); - - static::assertSame( - 'someValue', $result->someAttribute, 'Expected value someValue, found :' . $result->someAttribute - ); - } - /** * Test if the explain function works @@ -767,7 +725,7 @@ public function testCacheAttributeNotSet() } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/StreamingTransactionTest.php b/tests/StreamingTransactionTest.php index 060cd78a..b0ae8edb 100644 --- a/tests/StreamingTransactionTest.php +++ b/tests/StreamingTransactionTest.php @@ -34,7 +34,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { // transactions to shut down later $this->_shutdown = []; @@ -658,7 +658,7 @@ public function testAbortAndthenCommitTransaction() static::assertFalse($success); } - public function tearDown() + public function tearDown(): void { foreach ($this->_shutdown as $trx) { try { diff --git a/tests/TransactionTest.php b/tests/TransactionTest.php index 5a98d666..67fe44fa 100644 --- a/tests/TransactionTest.php +++ b/tests/TransactionTest.php @@ -32,7 +32,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); @@ -381,7 +381,7 @@ function () { } - public function tearDown() + public function tearDown(): void { try { $this->collectionHandler->drop('ArangoDB_PHP_TestSuite_TestCollection_01' . '_' . static::$testsTimestamp); diff --git a/tests/TraversalTest.php b/tests/TraversalTest.php index d6912f4f..65b4a628 100644 --- a/tests/TraversalTest.php +++ b/tests/TraversalTest.php @@ -65,7 +65,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->vertex1Name = 'vertex_alice'; $this->vertex2Name = 'vertex_bob'; @@ -640,7 +640,7 @@ public function testTraversalTooManyIterations() } - public function tearDown() + public function tearDown(): void { try { $result = $this->graphHandler->dropGraph($this->graphName); diff --git a/tests/UserBasicTest.php b/tests/UserBasicTest.php index 9c7af8f0..f81197cb 100644 --- a/tests/UserBasicTest.php +++ b/tests/UserBasicTest.php @@ -28,7 +28,7 @@ public function __construct($name = null, array $data = [], $dataName = '') static::$testsTimestamp = str_replace('.', '_', (string) microtime(true)); } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->userHandler = new UserHandler($this->connection); @@ -429,7 +429,7 @@ public function testFunctionsOnNonExistentUser() static::assertInstanceOf(ServerException::class, $e, 'should have gotten an exception'); } - public function tearDown() + public function tearDown(): void { try { $this->userHandler->removeUser('testUser1'); diff --git a/tests/ViewTest.php b/tests/ViewTest.php index 55213b21..916440a5 100644 --- a/tests/ViewTest.php +++ b/tests/ViewTest.php @@ -29,7 +29,7 @@ public function __construct($name = null, array $data = [], $dataName = '') } - public function setUp() + public function setUp(): void { $this->connection = getConnection(); $this->viewHandler = new ViewHandler($this->connection); @@ -176,7 +176,7 @@ public function testRenameNonExistingView() static::assertEquals(404, $exception->getCode()); } - public function tearDown() + public function tearDown(): void { $this->viewHandler = new ViewHandler($this->connection); try { diff --git a/tests/phpunit-connection-close.xml b/tests/phpunit-connection-close.xml index c9e41b09..b7a961ec 100644 --- a/tests/phpunit-connection-close.xml +++ b/tests/phpunit-connection-close.xml @@ -1,16 +1,16 @@ - - - - . - - - - - ../lib - - - - - + + + + ../lib + + + + + . + + + + + diff --git a/tests/phpunit-connection-keep-alive.xml b/tests/phpunit-connection-keep-alive.xml index 8df9166a..81e5dcb1 100644 --- a/tests/phpunit-connection-keep-alive.xml +++ b/tests/phpunit-connection-keep-alive.xml @@ -1,16 +1,16 @@ - - - - . - - - - - ../lib - - - - - + + + + ../lib + + + + + . + + + + + From 56fa2eb5b6316ced8866bed9c5bc94b665270080 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 18 Jun 2021 14:03:18 +0200 Subject: [PATCH 074/101] update travis ci badges --- CHANGELOG.md | 9 +++++++++ README.md | 10 ++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c17fdc35..05597e71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,15 @@ in a previous release and is not available in ArangoDB 3.9 anymore: ## Release notes for the ArangoDB-PHP driver 3.8.x +OPTION_TIMEOUT of the Connection class is now superseded by the more specialized options +- OPTION_CONNECT_TIMEOUT +- OPTION_REQUEST_TIMEOUT + +The existing OPTION_TIMEOUT value can still be used as before. When used, it will +automatically clobber values set in OPTION_CONNECT_TIMEOUT and OPTION_REQUEST_TIMEOUT. +Using one of the more specialized options will remove OPTION_TIMEOUT from the connection's +options. + Added CollectionHandler::insertMany() method to simplify insertion of multiple documents at once. This is now the preferred way of inserting mutliple documents in a single request, and will perform much better than using the `Batch` functionality, which is diff --git a/README.md b/README.md index 2566922b..e5c17944 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,10 @@ The official ArangoDB PHP Driver. -3.4: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.4)](https://travis-ci.org/arangodb/arangodb-php) -3.5: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.5)](https://travis-ci.org/arangodb/arangodb-php) -3.6: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.6)](https://travis-ci.org/arangodb/arangodb-php) -3.7: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.7)](https://travis-ci.org/arangodb/arangodb-php) -3.8: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=3.8)](https://travis-ci.org/arangodb/arangodb-php) -devel: [![Build Status](https://travis-ci.org/arangodb/arangodb-php.png?branch=devel)](https://travis-ci.org/arangodb/arangodb-php) +3.6: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=3.6)](https://travis-ci.com/arangodb/arangodb-php) +3.7: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=3.7)](https://travis-ci.com/arangodb/arangodb-php) +3.8: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=3.8)](https://travis-ci.com/arangodb/arangodb-php) +devel: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=devel)(https://travis-ci.com/arangodb/arangodb-php) - [Getting Started](https://www.arangodb.com/docs/stable/drivers/php-getting-started.html) - [Tutorial](https://www.arangodb.com/docs/stable/drivers/php-tutorial.html) From 41b43a8ae7b83ddcd28a6e9dab5a0c5b2ca8396a Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 18 Jun 2021 14:05:40 +0200 Subject: [PATCH 075/101] add missing parenthesis --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e5c17944..3ccb423a 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ The official ArangoDB PHP Driver. 3.6: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=3.6)](https://travis-ci.com/arangodb/arangodb-php) 3.7: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=3.7)](https://travis-ci.com/arangodb/arangodb-php) 3.8: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=3.8)](https://travis-ci.com/arangodb/arangodb-php) -devel: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=devel)(https://travis-ci.com/arangodb/arangodb-php) +devel: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=devel)](https://travis-ci.com/arangodb/arangodb-php) - [Getting Started](https://www.arangodb.com/docs/stable/drivers/php-getting-started.html) - [Tutorial](https://www.arangodb.com/docs/stable/drivers/php-tutorial.html) From 08e6cbb34505965042ac30d09ab2d547cb253d8b Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 2 Aug 2021 14:56:12 +0200 Subject: [PATCH 076/101] remove test part checking for collection status --- tests/CollectionExtendedTest.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/CollectionExtendedTest.php b/tests/CollectionExtendedTest.php index 7bc7ea8b..4d770060 100644 --- a/tests/CollectionExtendedTest.php +++ b/tests/CollectionExtendedTest.php @@ -458,11 +458,7 @@ public function testCreateGetAndDeleteCollectionWithWaitForSyncTrue() $unloadResult = $collectionHandler->unload($collection->getName()); $unloadResult = $unloadResult->getJson(); static::assertArrayHasKey('status', $unloadResult, 'status field should exist'); - static::assertTrue( - $unloadResult['status'] === 4 || $unloadResult['status'] === 2, - 'Collection status should be 4 (in the process of being unloaded) or 2 (unloaded). Found: ' . $unloadResult['status'] . '!' - ); - + static::assertEquals($unloadResult['status'], 3); // here we check the collectionHandler->load() function $loadResult = $collectionHandler->load($collection->getName()); From bf5771ee99b873ef865da18c1ce9610424d00003 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 30 Aug 2021 16:43:41 +0200 Subject: [PATCH 077/101] try to make driver ready for PHP 8 --- .travis.yml | 5 ----- CHANGELOG.md | 8 ++++++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d6aeecc..b6bb83f0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,11 +7,6 @@ services: matrix: fast_finish: true include: - - php: '5.6' - - php: '7.0' - - php: '7.1' - - php: '7.2' - - php: '7.3' - php: '7.4' - php: '8.0' allow_failures: diff --git a/CHANGELOG.md b/CHANGELOG.md index 05597e71..0f3efb28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,20 @@ ## Release notes for the ArangoDB-PHP driver 3.9.x +This version of the PHP driver is compatible with PHP versions 7.4 and 8.0. +Older versions of PHP are not supported. + This version of the PHP driver removes the following functionality, which was deprecated in a previous release and is not available in ArangoDB 3.9 anymore: - class Export - class ExportCursor +In addition, as the equivalent functionality has been deprecated on the +server side, the following driver methods have been deprecated as well: + +- CollectionHandler::load() +- CollectionHandler::unload() ## Release notes for the ArangoDB-PHP driver 3.8.x From b4c8ebca9201d66b516e68c30c2ffca2708d1cce Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 30 Aug 2021 16:50:52 +0200 Subject: [PATCH 078/101] test other phpunit version --- tests/travis/setup_arangodb.sh | 37 +--------------------------------- 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index 13cfee04..7f01bf21 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -2,33 +2,8 @@ echo "PHP version: $TRAVIS_PHP_VERSION" -if [[ "$TRAVIS_PHP_VERSION" == "5.6" ]] ; then -wget "https://phar.phpunit.de/phpunit-5.7.phar" -mv phpunit-5.7.phar ./phpunit -fi - -if [[ "$TRAVIS_PHP_VERSION" == "7.0" ]] ; then -wget "https://phar.phpunit.de/phpunit-6.0.phar" -mv phpunit-6.0.phar ./phpunit -fi - -if [[ "$TRAVIS_PHP_VERSION" == "7.1" ]] ; then -wget "https://phar.phpunit.de/phpunit-6.0.phar" -mv phpunit-6.0.phar ./phpunit -fi - -if [[ "$TRAVIS_PHP_VERSION" == "7.2" ]] ; then -wget "https://phar.phpunit.de/phpunit-6.0.phar" -mv phpunit-6.0.phar ./phpunit -fi - -if [[ "$TRAVIS_PHP_VERSION" == "7.3" ]] ; then -wget "https://phar.phpunit.de/phpunit-6.0.phar" -mv phpunit-6.0.phar ./phpunit -fi - if [[ "$TRAVIS_PHP_VERSION" == "7.4" ]] ; then -wget "https://phar.phpunit.de/phpunit-6.0.phar" +wget "https://phar.phpunit.de/phpunit-9.5.phar" mv phpunit-6.0.phar ./phpunit fi @@ -37,16 +12,6 @@ wget "https://phar.phpunit.de/phpunit-9.5.phar" mv phpunit-9.5.phar ./phpunit fi -if [[ "$TRAVIS_PHP_VERSION" == "hhvm" ]] ; then -wget "https://phar.phpunit.de/phpunit-6.0.phar" -mv phpunit-6.0.phar ./phpunit -fi - -if [[ "$TRAVIS_PHP_VERSION" == "hhvm-3.18" ]] ; then -wget "https://phar.phpunit.de/phpunit-5.7.phar" -mv phpunit-5.7.phar ./phpunit -fi - chmod +x ./phpunit echo "./phpunit --version" From 3d9feddf1a886b8744f21bc72e55745e73da200f Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 30 Aug 2021 16:54:26 +0200 Subject: [PATCH 079/101] try to fix setup --- .travis.yml | 2 -- tests/travis/setup_arangodb.sh | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b6bb83f0..038230e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,6 @@ matrix: include: - php: '7.4' - php: '8.0' - allow_failures: - - php: hhvm before_script: - chmod 777 ./tests/travis/setup_arangodb.sh diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index 7f01bf21..33763e23 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -4,7 +4,7 @@ echo "PHP version: $TRAVIS_PHP_VERSION" if [[ "$TRAVIS_PHP_VERSION" == "7.4" ]] ; then wget "https://phar.phpunit.de/phpunit-9.5.phar" -mv phpunit-6.0.phar ./phpunit +mv phpunit-9.5.phar ./phpunit fi if [[ "$TRAVIS_PHP_VERSION" == "8.0" ]] ; then From e515b5027cd8301364cb138d6b373d01816bbd16 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 30 Aug 2021 17:03:28 +0200 Subject: [PATCH 080/101] try to fix parse error --- lib/ArangoDBClient/GraphHandler.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/ArangoDBClient/GraphHandler.php b/lib/ArangoDBClient/GraphHandler.php index 401de509..c9163021 100644 --- a/lib/ArangoDBClient/GraphHandler.php +++ b/lib/ArangoDBClient/GraphHandler.php @@ -1020,7 +1020,7 @@ public function removeVertex($graph, $vertexId, $revision = null, array $options * @return mixed - id of edge created * @since 1.2 */ - public function saveEdge($graph, $from, $to, $label = null, $document, $collection = null) + public function saveEdge($graph, $from, $to, $label = null, $document = null, $collection = null) { if ($graph instanceof Graph) { $graph = $graph->getKey(); @@ -1037,6 +1037,9 @@ public function saveEdge($graph, $from, $to, $label = null, $document, $collecti $collection = $edgeCollections[0]; } } + if (!is_array($document) && !is_object($document)) { + throw new ClientException('Invalid document type.'); + } if (is_array($document)) { $_edgeClass = $this->_edgeClass; From 8b155745cef6904b0c61d27501a7b1011ba8ead7 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 31 Aug 2021 13:10:24 +0200 Subject: [PATCH 081/101] use Normalizer when creating databases --- CHANGELOG.md | 4 ++++ lib/ArangoDBClient/Database.php | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f3efb28..1d47c7ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ This version of the PHP driver is compatible with PHP versions 7.4 and 8.0. Older versions of PHP are not supported. +It is recommended to install the `php-intl` module so the PHP driver can access +the `Normalizer` class of that module. This is needed to create databases with +the extended database naming convention that can be enabled in ArangoDB 3.9. + This version of the PHP driver removes the following functionality, which was deprecated in a previous release and is not available in ArangoDB 3.9 anymore: diff --git a/lib/ArangoDBClient/Database.php b/lib/ArangoDBClient/Database.php index b1db5050..40501d14 100644 --- a/lib/ArangoDBClient/Database.php +++ b/lib/ArangoDBClient/Database.php @@ -58,6 +58,14 @@ class Database */ public static function create(Connection $connection, $name, array $options = []) { + try { + // NFC-normalize the database name, as this is required + // by the server + $name = \Normalizer::normalize($name, \Normalizer::FORM_C); + } catch (\Exception $e) { + // don't fail if Unicode normalization doesn't work. + // probably it is not installed. + } $payload = [ self::ENTRY_DATABASE_NAME => $name, self::ENTRY_DATABASE_USERS => [ From 7a74be96b8fa0f82823396b47a71aec9bce1c2e8 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 31 Aug 2021 15:49:11 +0200 Subject: [PATCH 082/101] fix attempt for Normalizer --- lib/ArangoDBClient/Database.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/ArangoDBClient/Database.php b/lib/ArangoDBClient/Database.php index 40501d14..3ffd7cac 100644 --- a/lib/ArangoDBClient/Database.php +++ b/lib/ArangoDBClient/Database.php @@ -61,7 +61,9 @@ public static function create(Connection $connection, $name, array $options = [] try { // NFC-normalize the database name, as this is required // by the server - $name = \Normalizer::normalize($name, \Normalizer::FORM_C); + if (class_exists("\Normalizer", false)) { + $name = \Normalizer::normalize($name, \Normalizer::FORM_C); + } } catch (\Exception $e) { // don't fail if Unicode normalization doesn't work. // probably it is not installed. From 282a90432eb8c77b3a169f18e911fc53702d1245 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 21 Oct 2021 17:12:22 +0200 Subject: [PATCH 083/101] enable extra analyzer tests --- tests/AnalyzerTest.php | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/tests/AnalyzerTest.php b/tests/AnalyzerTest.php index beb38ccc..7779ca19 100644 --- a/tests/AnalyzerTest.php +++ b/tests/AnalyzerTest.php @@ -43,7 +43,7 @@ public function testCreateAnalyzerObject() $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'text', [ "locale" => "en.UTF-8", "stopwords" => [] ]); static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $analyzer->getName()); static::assertEquals('text', $analyzer->getType()); - static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ], $analyzer->getProperties()); static::assertEquals([], $analyzer->getFeatures()); } @@ -69,7 +69,7 @@ public function testCreateTextAnalyzer() $result = $this->analyzerHandler->create($analyzer); static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); static::assertEquals('text', $result['type']); - static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ], $analyzer->getProperties()); static::assertEquals([], $analyzer->getFeatures()); } @@ -89,17 +89,15 @@ public function testCreateTextAnalyzerFail() /** * Test creation of stopwords analyzer */ - /* disabled until 3.8.1 public function testCreateStopwordsAnalyzer() { $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'stopwords', [ "stopwords" => ["foo", "bar", "baz", "dead"] ]); $result = $this->analyzerHandler->create($analyzer); static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); static::assertEquals('stopwords', $result['type']); - static::assertEquals([ "stopwords" => ["foo", "bar", "baz", "dead"] ],$analyzer->getProperties()); + static::assertEquals([ "stopwords" => ["foo", "bar", "baz", "dead"] ], $analyzer->getProperties()); static::assertEquals([], $analyzer->getFeatures()); } - */ /** * Test creation of delimiter analyzer @@ -110,7 +108,7 @@ public function testCreateDelimiterAnalyzer() $result = $this->analyzerHandler->create($analyzer); static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); static::assertEquals('delimiter', $result['type']); - static::assertEquals([ "delimiter" => " " ],$analyzer->getProperties()); + static::assertEquals([ "delimiter" => " " ], $analyzer->getProperties()); static::assertEquals([], $analyzer->getFeatures()); } @@ -123,14 +121,13 @@ public function testCreateNormAnalyzer() $result = $this->analyzerHandler->create($analyzer); static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); static::assertEquals('norm', $result['type']); - static::assertEquals([ "locale" => "en.UTF-8", "accent" => false, "case" => "lower" ],$analyzer->getProperties()); + static::assertEquals([ "locale" => "en.UTF-8", "accent" => false, "case" => "lower" ], $analyzer->getProperties()); static::assertEquals([], $analyzer->getFeatures()); } /** * Test creation of pipeline analyzer */ - /* disabled until 3.8.1 public function testCreatePipelineAnalyzer() { $data = [ "pipeline" => [ @@ -147,7 +144,6 @@ public function testCreatePipelineAnalyzer() static::assertEquals($data, $analyzer->getProperties()); static::assertEquals([], $analyzer->getFeatures()); } - */ /** * Test getting an analyzer @@ -160,7 +156,7 @@ public function testGetAnalyzer() $result = $this->analyzerHandler->get('Analyzer1' . '_' . static::$testsTimestamp); static::assertEquals('_system::Analyzer1' . '_' . static::$testsTimestamp, $result->getName()); static::assertEquals('text', $result->getType()); - static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ], $analyzer->getProperties()); static::assertEquals([], $analyzer->getFeatures()); } @@ -252,13 +248,13 @@ public function testAnalyzerProperties() $result = $this->analyzerHandler->create($analyzer); static::assertEquals('Analyzer2' . '_' . static::$testsTimestamp, $result['name']); static::assertEquals('text', $result['type']); - static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ], $analyzer->getProperties()); static::assertEquals([], $analyzer->getFeatures()); $result = $this->analyzerHandler->properties($analyzer); static::assertEquals('_system::Analyzer2' . '_' . static::$testsTimestamp, $result['name']); static::assertEquals('text', $result['type']); - static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ],$analyzer->getProperties()); + static::assertEquals([ "locale" => "en.UTF-8", "stopwords" => [] ], $analyzer->getProperties()); static::assertEquals([], $analyzer->getFeatures()); } From fc982e58a1a19ae3afd955989f73829334379103 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 27 Oct 2021 00:38:59 +0200 Subject: [PATCH 084/101] add test for unicode database name (#287) --- lib/ArangoDBClient/Database.php | 39 +++++++++++----- lib/ArangoDBClient/UrlHelper.php | 2 +- tests/DatabaseTest.php | 80 +++++++++++++++++++++++++++++++- tests/travis/setup_arangodb.sh | 6 +-- 4 files changed, 110 insertions(+), 17 deletions(-) diff --git a/lib/ArangoDBClient/Database.php b/lib/ArangoDBClient/Database.php index 3ffd7cac..ac583ab6 100644 --- a/lib/ArangoDBClient/Database.php +++ b/lib/ArangoDBClient/Database.php @@ -43,7 +43,7 @@ class Database * This creates a new database
    * * @param Connection $connection - the connection to be used - * @param string $name - database name, for example 'myDatabase' + * @param string $name - database name, for example 'myDatabase' - must be NFC-normalized! * @param array $options - extra options for new collections in this database. *

    Options are :
    *

  • 'replicationFactor'
  • @@ -58,16 +58,6 @@ class Database */ public static function create(Connection $connection, $name, array $options = []) { - try { - // NFC-normalize the database name, as this is required - // by the server - if (class_exists("\Normalizer", false)) { - $name = \Normalizer::normalize($name, \Normalizer::FORM_C); - } - } catch (\Exception $e) { - // don't fail if Unicode normalization doesn't work. - // probably it is not installed. - } $payload = [ self::ENTRY_DATABASE_NAME => $name, self::ENTRY_DATABASE_USERS => [ @@ -195,6 +185,33 @@ public static function getInfo(Connection $connection) return $response->getJson(); } + + + /** + * normalizes a database name + * + * UTF-8 NFC Normalization is required for database names in case + * the extended naming scheme for databases is used. This has to + * be enabled on the server side and is present since server version + * 3.9. + * If the name needs normalization but no normalizer is installed, + * this function can fail and abort the program with a PHP fatal error. + * + * @param string $name - database name to normalize. + * + * @return string $name - The normalized name + */ + public static function normalizeName($name) + { + // first check if the database name follows the traditional + // naming scheme. if so, there is no need to normalize it. + if (!preg_match("/^[a-zA-Z0-9_\-]+$/", $name)) { + // extended database naming scheme. now NFC-normalize + // the database name, as this is required by the server + $name = \Normalizer::normalize($name, \Normalizer::FORM_C); + } + return $name; + } } class_alias(Database::class, '\triagens\ArangoDb\Database'); diff --git a/lib/ArangoDBClient/UrlHelper.php b/lib/ArangoDBClient/UrlHelper.php index b936309d..2a37a27a 100644 --- a/lib/ArangoDBClient/UrlHelper.php +++ b/lib/ArangoDBClient/UrlHelper.php @@ -66,7 +66,7 @@ public static function buildUrl($baseUrl, array $parts = []) @list(,$part) = explode('/', $part); } - $url .= '/' . urlencode($part); + $url .= '/' . rawurlencode($part); } return $url; diff --git a/tests/DatabaseTest.php b/tests/DatabaseTest.php index d2621a07..1af71028 100644 --- a/tests/DatabaseTest.php +++ b/tests/DatabaseTest.php @@ -45,6 +45,79 @@ public function setUp(): void } } + + public function testCreateDatabaseWithUnicodeName() + { + if (!class_exists("\Normalizer", false)) { + $this->markTestSkipped("unable to find Normalizer class. maybe php-intl is not installed?"); + return; + } + + // try to create a database with Unicode name. + // this may fail if the server side is not configured to allow + // Unicode database names + $database = "tröt tröt tröt_" . static::$testsTimestamp; + try { + $response = Database::create($this->connection, $database); + } catch (ServerException $exception) { + // ERROR_ARANGO_DATABASE_NAME_INVALID,1229,"database name invalid","Will be raised when an invalid database name is used." + if ($exception->getServerCode() === 1229) { + $this->markTestSkipped("server was not started with extended database naming scheme"); + return; + } + throw $exception; + } + + $response = Database::listDatabases($this->connection); + static::assertArrayHasKey($database, array_flip($response['result'])); + } + + + public function testCreateDatabaseWithUnicodeNameNormalization() + { + if (!class_exists("\Normalizer", false)) { + $this->markTestSkipped("unable to find Normalizer class. maybe php-intl is not installed?"); + return; + } + + $databases = [ "😀", "ﻚﻠﺑ ﻞﻄﻴﻓ", "かわいい犬" ]; + + // try to create a database with Unicode name. + // this may fail if the server side is not configured to allow + // Unicode database names + foreach ($databases as $database) { + $database = Database::normalizeName($database); + + try { + Database::delete($this->connection, $database); + } catch (\Exception $ex) { + // try to get rid of existing databases first. ignore if it does not exist. + } + + try { + $response = Database::create($this->connection, $database); + } catch (ServerException $exception) { + // ERROR_ARANGO_DATABASE_NAME_INVALID,1229,"database name invalid","Will be raised when an invalid database name is used." + if ($exception->getServerCode() === 1229) { + $this->markTestSkipped("server was not started with extended database naming scheme"); + return; + } + throw $exception; + } + + try { + $response = Database::listDatabases($this->connection); + static::assertArrayHasKey($database, array_flip($response['result'])); + + Database::delete($this->connection, $database); + } catch (\Exception $ex) { + // always clean up + Database::delete($this->connection, $database); + throw $ex; + } + } + } + /** * Test if Databases can be created and deleted */ @@ -53,7 +126,6 @@ public function testCreateDatabaseDeleteIt() $database = 'ArangoTestSuiteDatabaseTest01' . '_' . static::$testsTimestamp; try { - $e = null; Database::delete($this->connection, $database); } catch (\Exception $e) { // don't bother us... just give us the $e @@ -354,7 +426,11 @@ public function tearDown(): void $this->connection->setDatabase('_system'); // clean up - $databases = ['ArangoTestSuiteDatabaseTest01' . '_' . static::$testsTimestamp, 'ArangoTestSuiteDatabaseTest02' . '_' . static::$testsTimestamp]; + $databases = [ + 'ArangoTestSuiteDatabaseTest01' . '_' . static::$testsTimestamp, + 'ArangoTestSuiteDatabaseTest02' . '_' . static::$testsTimestamp, + 'tröt tröt tröt_' . static::$testsTimestamp, + ]; foreach ($databases as $database) { try { diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index 33763e23..ce778715 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -3,12 +3,12 @@ echo "PHP version: $TRAVIS_PHP_VERSION" if [[ "$TRAVIS_PHP_VERSION" == "7.4" ]] ; then -wget "https://phar.phpunit.de/phpunit-9.5.phar" +wget --no-check-certificate "https://phar.phpunit.de/phpunit-9.5.phar" mv phpunit-9.5.phar ./phpunit fi if [[ "$TRAVIS_PHP_VERSION" == "8.0" ]] ; then -wget "https://phar.phpunit.de/phpunit-9.5.phar" +wget --no-check-certificate "https://phar.phpunit.de/phpunit-9.5.phar" mv phpunit-9.5.phar ./phpunit fi @@ -21,7 +21,7 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $DIR docker pull arangodb/arangodb-preview:3.9.0-nightly -docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:3.9.0-nightly +docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:3.9.0-nightly arangod --database.extended-names-databases true sleep 2 From cb1e338173a0f9e9899000289a470e1dc521d3a1 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 11 Jan 2022 16:21:01 +0100 Subject: [PATCH 085/101] add support for zkd indexes --- lib/ArangoDBClient/CollectionHandler.php | 43 ++++++++++++++++ tests/.phpunit.result.cache | 1 + tests/CollectionBasicTest.php | 63 ++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 tests/.phpunit.result.cache diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index 3ece4e03..80f52c0e 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -116,6 +116,11 @@ class CollectionHandler extends Handler * fields */ const OPTION_FIELDS = 'fields'; + + /** + * fieldValueTypes (zkd index only) + */ + const OPTION_FIELD_VALUE_TYPES = 'fieldValueTypes'; /** * unique @@ -156,6 +161,11 @@ class CollectionHandler extends Handler * minLength option */ const OPTION_MIN_LENGTH = 'minLength'; + + /** + * zkd index option + */ + const OPTION_ZKD_INDEX = 'zkd'; /** * skiplist index option @@ -918,6 +928,39 @@ public function createFulltextIndex($collection, array $fields, $minLength = nul return $this->createIndex($collection, $indexOptions); } + + + /** + * Create a zkd index + * + * @param mixed $collection - collection as string or object + * @param array $fields - an array of fields + * @param bool $unique - whether the index is unique or not + * @param string $fieldValueTypes - data type of index values + * @param bool $inBackground - true if index shall be created in background + * + * @deprecated use CollectionHandler::createIndex instead + * + * @return array - server response of the created index + * @throws \ArangoDBClient\Exception + */ + public function createZkdIndex($collection, array $fields, $unique = null, $fieldValueTypes = "double", $inBackground = false) + { + $indexOptions = [ + self::OPTION_TYPE => 'zkd', + self::OPTION_FIELDS => $fields, + self::OPTION_FIELD_VALUE_TYPES => $fieldValueTypes, + ]; + + if ($unique) { + $indexOptions[self::OPTION_UNIQUE] = (bool) $unique; + } + if ($inBackground) { + $indexOptions[self::OPTION_IN_BACKGROUND] = (bool) $inBackground; + } + + return $this->createIndex($collection, $indexOptions); + } /** * Create a skip-list index diff --git a/tests/.phpunit.result.cache b/tests/.phpunit.result.cache new file mode 100644 index 00000000..de8606a2 --- /dev/null +++ b/tests/.phpunit.result.cache @@ -0,0 +1 @@ +{"version":1,"defects":{"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithKeyOptionsCluster":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithDistributeShardsLike":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithNumberOfShardsCluster":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithReplicationFactor1":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithReplicationFactor2":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithReplicationFactorSatellite":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithShardingStrategyCommunityCompat":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithShardingStrategyHash":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithoutShardingStrategy":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithShardKeysCluster":1,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithSmartJoinAttribute":1,"ArangoDBClient\\CollectionBasicTest::testCollectionCountDetailed":1,"ArangoDBClient\\CollectionBasicTest::testGetShards":1,"ArangoDBClient\\CollectionBasicTest::testGetResponsibleShard":1,"ArangoDBClient\\DatabaseTest::testCreateDatabaseWithUnicodeName":1,"ArangoDBClient\\DatabaseTest::testCreateDatabaseWithUnicodeNameNormalization":1,"ArangoDBClient\\DatabaseTest::testCreateDatabaseWithOptions":1,"ArangoDBClient\\DatabaseTest::testCreateDatabaseWithMoreOptions":1,"ArangoDBClient\\CollectionBasicTest::testCreateZkdIndex":4},"times":{"ArangoDBClient\\AdminTest::testEngine":0.003,"ArangoDBClient\\AdminTest::testEngineStats":0.001,"ArangoDBClient\\AdminTest::testGetServerVersion":0,"ArangoDBClient\\AdminTest::testGetServerVersionWithDetails":0,"ArangoDBClient\\AdminTest::testGetServerTime":0,"ArangoDBClient\\AdminTest::testGetServerLogEntries":0,"ArangoDBClient\\AdminTest::testGetServerLog":0.001,"ArangoDBClient\\AdminTest::testGetServerMetrics":0.002,"ArangoDBClient\\AdminTest::testReloadServerRouting":0,"ArangoDBClient\\AdminTest::testGetServerStatistics":0,"ArangoDBClient\\AdminTest::testGetServerStatisticsDescription":0,"ArangoDBClient\\AnalyzerTest::testCreateAnalyzerObject":0.002,"ArangoDBClient\\AnalyzerTest::testCreateIdentityAnalyzer":0.005,"ArangoDBClient\\AnalyzerTest::testCreateTextAnalyzer":0.005,"ArangoDBClient\\AnalyzerTest::testCreateTextAnalyzerFail":0.003,"ArangoDBClient\\AnalyzerTest::testCreateStopwordsAnalyzer":0.007,"ArangoDBClient\\AnalyzerTest::testCreateDelimiterAnalyzer":0.006,"ArangoDBClient\\AnalyzerTest::testCreateNormAnalyzer":0.007,"ArangoDBClient\\AnalyzerTest::testCreatePipelineAnalyzer":0.007,"ArangoDBClient\\AnalyzerTest::testGetAnalyzer":0.009,"ArangoDBClient\\AnalyzerTest::testGetDefaultAnalyzers":0.003,"ArangoDBClient\\AnalyzerTest::testGetAllAnalyzers":0.014,"ArangoDBClient\\AnalyzerTest::testGetNonExistingAnalyzer":0.003,"ArangoDBClient\\AnalyzerTest::testAnalyzerProperties":0.015,"ArangoDBClient\\AnalyzerTest::testDropAnalyzer":0.008,"ArangoDBClient\\AnalyzerTest::testDropNonExistingAnalyzer":0.003,"ArangoDBClient\\AqlUserFunctionTest::testRegisterListAndUnRegisterAqlUserFunctionWithInitialConfig":0.013,"ArangoDBClient\\AqlUserFunctionTest::testRegisterListAndUnRegisterAqlUserFunctionUsingShortcut":0.014,"ArangoDBClient\\AqlUserFunctionTest::testRegisterListAndUnRegisterAqlUserFunctionWithGettersAndSetters":0.013,"ArangoDBClient\\AqlUserFunctionTest::testRegisterListAndUnRegisterAqlUserFunctionWithWithMagicSettersAndGetters":0.01,"ArangoDBClient\\AqlUserFunctionTest::testReRegisterListAndUnRegisterAqlUserFunctionTwice":0.012,"ArangoDBClient\\AqlUserFunctionTest::testGetAQLFunctionsWithNamespaceFilter":0.012,"ArangoDBClient\\AqlUserFunctionTest::testUnRegisterAQLFunctionsOnNamespace":0.013,"ArangoDBClient\\BatchTest::testEmptyBatch":0.01,"ArangoDBClient\\BatchTest::testPartIds":0.009,"ArangoDBClient\\BatchTest::testProcessProcess":0.008,"ArangoDBClient\\BatchTest::testCreateDocumentBatch":0.006,"ArangoDBClient\\BatchTest::testCreateDocumentBatchWithDefinedBatchSize":0.006,"ArangoDBClient\\BatchTest::testFailureWhenCreatingMoreDocumentsInBatchThanDefinedBatchSize":0.003,"ArangoDBClient\\BatchTest::testCreateMixedBatchWithPartIds":0.022,"ArangoDBClient\\BatchTest::testRemoveByKeysInBatch":0.011,"ArangoDBClient\\BatchTest::testCollectionHandlerAllInBatch":0.009,"ArangoDBClient\\BatchTest::testFirstExampleBatch":0.014,"ArangoDBClient\\BatchTest::testByExampleBatch":0.014,"ArangoDBClient\\CollectionBasicTest::testDefaultCollectionType":0.005,"ArangoDBClient\\CollectionBasicTest::testInitializeCollection":0.001,"ArangoDBClient\\CollectionBasicTest::testInitializeCollectionWithDocumentType":0.001,"ArangoDBClient\\CollectionBasicTest::testInitializeCollectionWithEdgeType":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionLongName":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionTooLongName":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateAndDeleteCollectionPre1_2":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithKeyOptionsAndVerifyProperties":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithKeyOptionsCluster":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithDistributeShardsLike":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithNumberOfShardsCluster":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithReplicationFactor1":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithReplicationFactor2":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithReplicationFactorSatellite":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithShardingStrategyCommunityCompat":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithShardingStrategyHash":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithoutShardingStrategy":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithShardKeysCluster":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateCollectionWithSmartJoinAttribute":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateAndDeleteCollection":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateAndDeleteEdgeCollection":0.003,"ArangoDBClient\\CollectionBasicTest::testCreateAndDeleteEdgeCollectionWithoutCreatingObject":0.003,"ArangoDBClient\\CollectionBasicTest::testCreateAndDeleteSystemCollectionWithoutCreatingObject":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateIndex":0.003,"ArangoDBClient\\CollectionBasicTest::testGetIndexById":0.002,"ArangoDBClient\\CollectionBasicTest::testGetIndexByName":0.002,"ArangoDBClient\\CollectionBasicTest::testDropIndexById":0.002,"ArangoDBClient\\CollectionBasicTest::testDropIndexByName":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateGeo1Index":0.003,"ArangoDBClient\\CollectionBasicTest::testCreateGeo2Index":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateHashIndex":0.003,"ArangoDBClient\\CollectionBasicTest::testCreateSparseHashIndex":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateFulltextIndex":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateSkipListIndex":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateSparseSkipListIndex":0.002,"ArangoDBClient\\CollectionBasicTest::testCreatePersistentIndex":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateSparsePersistentIndex":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateTtlIndex":0.002,"ArangoDBClient\\CollectionBasicTest::testGetIndex":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateIndexInBackground":0.011,"ArangoDBClient\\CollectionBasicTest::testHasCollectionReturnsFalseIfCollectionDoesNotExist":0.002,"ArangoDBClient\\CollectionBasicTest::testHasCollectionReturnsTrueIfCollectionExists":0.002,"ArangoDBClient\\CollectionBasicTest::testCollectionCountDetailed":0.001,"ArangoDBClient\\CollectionBasicTest::testGetShards":0.001,"ArangoDBClient\\CollectionBasicTest::testGetResponsibleShard":0.001,"ArangoDBClient\\CollectionExtendedTest::testCreateWithNoSchema":0.002,"ArangoDBClient\\CollectionExtendedTest::testCreateWithSchema":0.002,"ArangoDBClient\\CollectionExtendedTest::testCreateGetAndDeleteCollectionWithWaitForSyncDefault":0.001,"ArangoDBClient\\CollectionExtendedTest::testCreateGetAndDeleteSystemCollection":0.001,"ArangoDBClient\\CollectionExtendedTest::testGetAllNonSystemCollections":0.002,"ArangoDBClient\\CollectionExtendedTest::testGetChecksum":0.002,"ArangoDBClient\\CollectionExtendedTest::testGetChecksumWithException":0.001,"ArangoDBClient\\CollectionExtendedTest::testGetRevision":0.002,"ArangoDBClient\\CollectionExtendedTest::testGetRevisionWithException":0.001,"ArangoDBClient\\CollectionExtendedTest::testCreateRenameAndDeleteCollection":0.002,"ArangoDBClient\\CollectionExtendedTest::testCreateGetAndDeleteCollectionWithWaitForSyncTrue":0.017,"ArangoDBClient\\CollectionExtendedTest::testCreateGetAndDeleteCollectionThroughCreateFromArrayWithWaitForSyncTrue":0.009,"ArangoDBClient\\CollectionExtendedTest::testRemoveByKeys":0.013,"ArangoDBClient\\CollectionExtendedTest::testRemoveByKeysCollectionNotFound":0.004,"ArangoDBClient\\CollectionExtendedTest::testRemoveByKeysNotFound":0.007,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsAndRemoveByExampleEmptyExample":0.006,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsAndUpdateByExampleEmptyExample":0.006,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsAndUpdateByExampleEmptyUpdateExample":0.006,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsAndReplaceByExampleEmptyExample":0.006,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsAndReplaceByExampleEmptyReplaceExample":0.005,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsAndQueryByExampleEmptyExample":0.004,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsWithCreateFromArrayAndRemoveByExample":0.028,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsWithCreateFromArrayGetAsArrayAndRemoveByExample":0.015,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsWithCreateFromArrayUpdateReplaceAndRemoveByExample":0.04,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsFromArrayUpdateReplaceAndRemoveByExample":0.041,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsWithCreateFromArrayUpdateReplaceAndRemoveByExampleWithLimits":0.039,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsWithCreateFromArrayUpdateReplaceAndRemoveByExampleWithWaitForSync":0.04,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsWithCreateFromArrayUpdateReplaceAndRemoveByExampleWithKeepNull":0.034,"ArangoDBClient\\CollectionExtendedTest::testCreateDocumentsWithCreateFromArrayAndRemoveByExampleWithLimit":0.027,"ArangoDBClient\\CollectionExtendedTest::testImportFromFileUsingHeadersAndValues":0.014,"ArangoDBClient\\CollectionExtendedTest::testImportFromFileUsingDocumentsLineByLine":0.012,"ArangoDBClient\\CollectionExtendedTest::testImportFromFileUsingResultSet":0.013,"ArangoDBClient\\CollectionExtendedTest::testImportFromArrayOfDocuments":0.012,"ArangoDBClient\\CollectionExtendedTest::testImportFromStringWithValuesAndHeaders":0.013,"ArangoDBClient\\CollectionExtendedTest::testImportFromStringUsingDocumentsLineByLine":0.013,"ArangoDBClient\\CollectionExtendedTest::testImportFromStringUsingDocumentsUsingResultset":0.012,"ArangoDBClient\\CollectionExtendedTest::testCreateGetAllIdsAndDeleteCollectionThroughCreateFromArray":0.014,"ArangoDBClient\\CollectionExtendedTest::testCreateAndAllAndDeleteCollection":0.013,"ArangoDBClient\\CollectionExtendedTest::testCreateAndIssueAllWithHiddenAttributesAndDeleteCollection":0.008,"ArangoDBClient\\CollectionExtendedTest::testCreateAndIssueAllWithHiddenAttributesButDifferentDocGetAllOptionsAndDeleteCollection":0.009,"ArangoDBClient\\CollectionExtendedTest::testCreateAndAllWithLimitAndDeleteCollection":0.004,"ArangoDBClient\\CollectionExtendedTest::testCreateAndAllWithSkipAndDeleteCollection":0.005,"ArangoDBClient\\CollectionExtendedTest::testCreateFillAndTruncateCollection":0.017,"ArangoDBClient\\CollectionExtendedTest::testGetAll":0.001,"ArangoDBClient\\CollectionExtendedTest::testCreateHashIndex":0.004,"ArangoDBClient\\CollectionExtendedTest::testCreateUniqueHashIndex":0.003,"ArangoDBClient\\CollectionExtendedTest::testCreateSkipListIndexedCollectionAddDocumentsAndQueryRange":0.012,"ArangoDBClient\\CollectionExtendedTest::testCreateGeoIndexedCollectionAddDocumentsAndQueryNear":0.018,"ArangoDBClient\\CollectionExtendedTest::testCreateGeoIndexedCollectionAddDocumentsAndQueryWithin":0.013,"ArangoDBClient\\CollectionExtendedTest::testCreateFulltextIndexedCollectionAddDocumentsAndQuery":0.015,"ArangoDBClient\\CollectionExtendedTest::testCreateFulltextIndexedCollectionWithOptions":0.003,"ArangoDBClient\\CollectionExtendedTest::testCreateArrayIndex":0.003,"ArangoDBClient\\CollectionExtendedTest::testCreateArrayIndexWithDeduplicateOption":0.003,"ArangoDBClient\\CollectionExtendedTest::testCreateIndexWithDisabledEstimates":0.003,"ArangoDBClient\\CollectionExtendedTest::testCreateTtlIndex":0.003,"ArangoDBClient\\CollectionExtendedTest::testAnyDocumentInCollection":0.007,"ArangoDBClient\\CollectionExtendedTest::testAnyDocumentInNonExistentCollection":0.002,"ArangoDBClient\\CollectionExtendedTest::testAnyDocumentInAnEmptyCollection":0.003,"ArangoDBClient\\CollectionExtendedTest::testFulltextQuery":0.016,"ArangoDBClient\\CollectionExtendedTest::testLookupByKeys":0.004,"ArangoDBClient\\CollectionExtendedTest::testLookupByCollectionNotFound":0.002,"ArangoDBClient\\ConnectionTest::testInitializeConnection":0.001,"ArangoDBClient\\ConnectionTest::testTestUnconnected":2.007,"ArangoDBClient\\ConnectionTest::testTest":0.001,"ArangoDBClient\\ConnectionTest::testEndpointAndPort":0.001,"ArangoDBClient\\ConnectionTest::testGetStatus":0.001,"ArangoDBClient\\ConnectionTest::testGetOptions":0,"ArangoDBClient\\ConnectionTest::testSetOptions":0,"ArangoDBClient\\ConnectionTest::testTimeoutOptions":0,"ArangoDBClient\\ConnectionTest::testSetEndpointOption":0,"ArangoDBClient\\ConnectionTest::testSetAllowSelfSignedOption":0,"ArangoDBClient\\ConnectionTest::testSetVerifyCert":0,"ArangoDBClient\\ConnectionTest::testSetCiphers":0,"ArangoDBClient\\ConnectionTest::testSetHostOption":0,"ArangoDBClient\\ConnectionTest::testSetPortOption":0,"ArangoDBClient\\ConnectionTest::testGetSetDatabase":0,"ArangoDBClient\\ConnectionTest::testSetTimeoutException":3.001,"ArangoDBClient\\ConnectionTest::testSetTimeout":1.003,"ArangoDBClient\\ConnectionTest::testSetConnectTimeout":1.004,"ArangoDBClient\\ConnectionTest::testSetRequestTimeoutException":2.005,"ArangoDBClient\\ConnectionTest::testSetRequestTimeout":1.007,"ArangoDBClient\\ConnectionTest::testConnectionClose":0.001,"ArangoDBClient\\ConnectionTest::testConnectionKeepAlive":0.001,"ArangoDBClient\\ConnectionTest::testAuthentication":0.001,"ArangoDBClient\\ConnectionTest::testBasicTracer":0.002,"ArangoDBClient\\ConnectionTest::testEnhancedTracer":0.01,"ArangoDBClient\\CustomDocumentClassTest::testGetCustomDocumentWithHandler":0.007,"ArangoDBClient\\CustomDocumentClassTest::testGetCustomDocumentWithStatement":0.007,"ArangoDBClient\\CustomDocumentClassTest::testGetCustomDocumentWithBatch":0.01,"ArangoDBClient\\CustomEdgeClassTest::testGetCustomEdgeWithHandler":0.008,"ArangoDBClient\\DatabaseTest::testCreateDatabaseWithUnicodeName":0.005,"ArangoDBClient\\DatabaseTest::testCreateDatabaseWithUnicodeNameNormalization":0.004,"ArangoDBClient\\DatabaseTest::testCreateDatabaseDeleteIt":0.045,"ArangoDBClient\\DatabaseTest::testCreateDatabaseGetListOfDatabasesAndDeleteItAgain":0.032,"ArangoDBClient\\DatabaseTest::testCreateDatabaseGetInfoOfDatabasesAndDeleteItAgain":0.021,"ArangoDBClient\\DatabaseTest::testCreateDatabaseWithOptions":0.001,"ArangoDBClient\\DatabaseTest::testCreateDatabaseWithMoreOptions":0.001,"ArangoDBClient\\DatabaseTest::testDeleteNonExistentDatabase":0.001,"ArangoDBClient\\DatabaseTest::testCreateDatabaseSwitchToItAndCreateAnotherOne":0.019,"ArangoDBClient\\DocumentBasicTest::testInitializeDocument":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertSilent":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertSilentWithError":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertReturnNew":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertMany":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertManyReturnNew":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertManySilent":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertManyWithErrors":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertManySilentWithErrors":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertManyLarge":0.092,"ArangoDBClient\\DocumentBasicTest::testInsertManyEmpty":0.001,"ArangoDBClient\\DocumentBasicTest::testInsertOverwrite":0.002,"ArangoDBClient\\DocumentBasicTest::testInsertOverwriteMode":0.002,"ArangoDBClient\\DocumentBasicTest::testCreateAndDeleteDocumentWithId":0.001,"ArangoDBClient\\DocumentBasicTest::testCreateAndDeleteDocument":0.001,"ArangoDBClient\\DocumentBasicTest::testCreateAndDeleteDocumentSilent":0.001,"ArangoDBClient\\DocumentBasicTest::testDeleteDocumentSilentWithError":0.001,"ArangoDBClient\\DocumentBasicTest::testCreateAndDeleteDocumentWithoutCreatedCollection":0.002,"ArangoDBClient\\DocumentBasicTest::testCreateAndDeleteDocumentWithoutCreatedCollectionAndOptionCreate":0.002,"ArangoDBClient\\DocumentBasicTest::testCreateAndDeleteDocumentUsingDefinedKey":0.001,"ArangoDBClient\\DocumentBasicTest::testCreateAndDeleteDocumentWithSeveralKeys":0.03,"ArangoDBClient\\DocumentBasicTest::testCreateDocumentWithInvalidKeys":0.001,"ArangoDBClient\\DocumentBasicTest::testCreateAndDeleteDocumentWithArray":0.001,"ArangoDBClient\\DocumentBasicTest::testCreateGetAndDeleteDocumentWithRevision":0.003,"ArangoDBClient\\DocumentBasicTest::testCreateHeadAndDeleteDocumentWithRevision":0.001,"ArangoDBClient\\DocumentBasicTest::testCreateAndDeleteDocumentUsingDefinedKeyWithArrayAndSaveOnly":0.001,"ArangoDBClient\\DocumentBasicTest::testCreateAndVerifyValidJsonIsReturnedWhenCastToString":0.001,"ArangoDBClient\\DocumentBasicTest::testHasDocumentReturnsFalseIfDocumentDoesNotExist":0.001,"ArangoDBClient\\DocumentBasicTest::testHasDocumentReturnsTrueIfDocumentExists":0.001,"ArangoDBClient\\DocumentExtendedTest::testCreateDocumentWithCreateFromArrayGetAndDeleteDocument":0.001,"ArangoDBClient\\DocumentExtendedTest::testCreateDocumentWithCreateFromArrayGetByExampleAndDeleteDocument":0.002,"ArangoDBClient\\DocumentExtendedTest::testCreateDocumentWithCreateFromArrayGetByExampleWithOptionsAndDeleteDocument":0.02,"ArangoDBClient\\DocumentExtendedTest::testCreateDocumentWithCreateFromArrayGetFirstExampleAndDeleteDocument":0.009,"ArangoDBClient\\DocumentExtendedTest::testUpdateDocument":0.008,"ArangoDBClient\\DocumentExtendedTest::testUpdateDocumentMergeObjects":0.007,"ArangoDBClient\\DocumentExtendedTest::testUpdateDocumentDoNotMergeObjects":0.007,"ArangoDBClient\\DocumentExtendedTest::testUpdateDocumentDoNotKeepNull":0.007,"ArangoDBClient\\DocumentExtendedTest::testUpdateDocumentReturnOldNew":0.006,"ArangoDBClient\\DocumentExtendedTest::testUpdateDocumentSilent":0.006,"ArangoDBClient\\DocumentExtendedTest::testUpdateDocumentSilentWithError":0.005,"ArangoDBClient\\DocumentExtendedTest::testReplaceDocument":0.007,"ArangoDBClient\\DocumentExtendedTest::testReplaceDocumentReturnOldNew":0.005,"ArangoDBClient\\DocumentExtendedTest::testReplaceDocumentSilent":0.005,"ArangoDBClient\\DocumentExtendedTest::testReplaceDocumentSilentWithError":0.004,"ArangoDBClient\\DocumentExtendedTest::testDeleteDocumentWithDeleteByIdWithoutRevision":0.004,"ArangoDBClient\\DocumentExtendedTest::testDeleteDocumentWithDeleteByIdWithRevisionAndPolicyIsError":0.003,"ArangoDBClient\\DocumentExtendedTest::testDeleteDocumentWithDeleteByIdWithRevisionAndPolicyIsLast":0.002,"ArangoDBClient\\DocumentExtendedTest::testRemoveDocumentReturnOld":0.002,"ArangoDBClient\\DocumentExtendedTest::testCreateUpdateGetAndDeleteDocumentWithRevisionCheck":0.004,"ArangoDBClient\\DocumentExtendedTest::testMoreCreateUpdateGetAndDeleteDocumentWithRevisionCheck":0.004,"ArangoDBClient\\DocumentExtendedTest::testCreateSetNullAttributeUpdateGetAndDeleteDocumentWithRevisionCheck":0.003,"ArangoDBClient\\DocumentExtendedTest::testGetAll":0.001,"ArangoDBClient\\DocumentExtendedTest::testHiddenAttributesGetAll":0.002,"ArangoDBClient\\DocumentExtendedTest::testGetReplaceUpdateAndRemoveOnNonExistentObjects":0.003,"ArangoDBClient\\DocumentExtendedTest::testStoreNewDocumentThenReplace":0.001,"ArangoDBClient\\EdgeBasicTest::testInitializeEdge":0.002,"ArangoDBClient\\EdgeBasicTest::testCreateAndDeleteEdge":0.006,"ArangoDBClient\\EdgeBasicTest::testCreateAndDeleteEdgeWithoutCreatedEdgeCollection":0.006,"ArangoDBClient\\EdgeBasicTest::testCreateGetAndDeleteEdgeWithRevision":0.003,"ArangoDBClient\\EdgeBasicTest::testCreateHeadAndDeleteEdgeWithRevision":0.003,"ArangoDBClient\\EdgeBasicTest::testGetAllIds":0.003,"ArangoDBClient\\EdgeBasicTest::testEdges":0.004,"ArangoDBClient\\EdgeBasicTest::testEdgesAny":0.004,"ArangoDBClient\\EdgeBasicTest::testEdgesIn":0.004,"ArangoDBClient\\EdgeBasicTest::testEdgesOut":0.004,"ArangoDBClient\\EdgeBasicTest::testEdgesBatched":0.004,"ArangoDBClient\\EdgeExtendedTest::testGetReplaceUpdateAndRemoveOnNonExistentObjects":0.004,"ArangoDBClient\\EdgeExtendedTest::testUpdateEdge":0.004,"ArangoDBClient\\EdgeExtendedTest::testUpdateEdgeDoNotKeepNull":0.003,"ArangoDBClient\\EdgeExtendedTest::testReplaceEdge":0.005,"ArangoDBClient\\FoxxBasicTest::testUploadAndInstallFoxxApp":0.188,"ArangoDBClient\\FoxxBasicTest::testUploadAndInstallNonExistingFoxxApp":0.003,"ArangoDBClient\\GeneralGraphExtendedTest::testsaveGetUpdateReplaceRemoveVertex":0.014,"ArangoDBClient\\GeneralGraphExtendedTest::testsaveGetUpdateReplaceRemoveEdge":0.012,"ArangoDBClient\\GraphBasicTest::testCreateAndDeleteGraphsWithDefinitions":0.008,"ArangoDBClient\\GraphBasicTest::testCreationOfGraphObject":0.001,"ArangoDBClient\\GraphBasicTest::testCreateAndDeleteGraphByName":0.003,"ArangoDBClient\\GraphBasicTest::testCreateRetrieveAndDeleteGraph1":0.003,"ArangoDBClient\\GraphBasicTest::testGetPropertiesAndDeleteGraphByInstance":0.003,"ArangoDBClient\\GraphBasicTest::testGetNonExistingGraph":0.001,"ArangoDBClient\\GraphBasicTest::testAddGetDeleteCollections":0.006,"ArangoDBClient\\GraphBasicTest::testAddGetDeleteCollectionsWithCache":0.008,"ArangoDBClient\\GraphBasicTest::testAddGetDeleteEdgeCollections":0.007,"ArangoDBClient\\GraphExtendedTest::testSaveVerticesAndEdgeBetweenThemAndRemoveOneByOne":0.007,"ArangoDBClient\\GraphExtendedTest::testSaveVerticesAndEdgeBetweenThemAndRemoveOneByOneWithCache":0.007,"ArangoDBClient\\GraphExtendedTest::testSaveVerticesAndEdgeBetweenThemAndRemoveFirstVertexFirst":0.009,"ArangoDBClient\\GraphExtendedTest::testGetReplaceUpdateAndRemoveOnNonExistentObjects":0.006,"ArangoDBClient\\GraphExtendedTest::testSaveVertexReplaceUpdateAndRemove":0.007,"ArangoDBClient\\GraphExtendedTest::testSaveVertexConditionalReplaceUpdateAndRemove":0.006,"ArangoDBClient\\GraphExtendedTest::testSaveVerticesAndSaveReplaceUpdateAndRemoveEdge":0.009,"ArangoDBClient\\GraphExtendedTest::testSaveVerticesAndConditionalSaveReplaceUpdateAndRemoveEdge":0.008,"ArangoDBClient\\GraphExtendedTest::testSaveVerticesFromVertexHandlerAndEdgeFromEdgeHandlerBetweenThemAndRemoveFirstVertexFirst":0.005,"ArangoDBClient\\GraphExtendedTest::testSaveVertexWithGraphInstance":0.002,"ArangoDBClient\\GraphExtendedTest::testGetVertexWithGraphInstance":0.006,"ArangoDBClient\\GraphExtendedTest::testReplaceVertexWithGraphInstance":0.006,"ArangoDBClient\\GraphExtendedTest::testUpdateVertexWithGraphInstance":0.007,"ArangoDBClient\\GraphExtendedTest::testRemoveVertexWithGraphInstance":0.007,"ArangoDBClient\\GraphExtendedTest::testSaveEdgeWithGraphInstance":0.006,"ArangoDBClient\\GraphExtendedTest::testGetEdgeWithGraphInstance":0.006,"ArangoDBClient\\GraphExtendedTest::testReplaceEdgeWithGraphInstance":0.007,"ArangoDBClient\\GraphExtendedTest::testUpdateEdgeWithGraphInstance":0.007,"ArangoDBClient\\GraphExtendedTest::testRemoveEdgeWithGraphInstance":0.007,"ArangoDBClient\\GraphExtendedTest::testHasVertexReturnsFalseIfNotExists":0.003,"ArangoDBClient\\GraphExtendedTest::testHasVertexReturnsTrueIfExists":0.007,"ArangoDBClient\\GraphExtendedTest::testHasEdgeReturnsFalseIfNotExists":0.003,"ArangoDBClient\\GraphExtendedTest::testHasEdgeReturnsTrueIfExists":0.007,"ArangoDBClient\\QueryCacheTest::testClear":0.025,"ArangoDBClient\\QueryCacheTest::testGetEntries":0.02,"ArangoDBClient\\QueryCacheTest::testEnable":0.021,"ArangoDBClient\\QueryCacheTest::testEnabledButExplicitlyDisabledForQuery":0.02,"ArangoDBClient\\QueryCacheTest::testDisable":0.021,"ArangoDBClient\\QueryCacheTest::testDemandModeUsed1":0.02,"ArangoDBClient\\QueryCacheTest::testDemandModeUsed2":0.021,"ArangoDBClient\\QueryCacheTest::testDemandModeUnused":0.021,"ArangoDBClient\\QueryTest::testCurrentAndKill":3.002,"ArangoDBClient\\QueryTest::testGetSlowEmpty":0.001,"ArangoDBClient\\QueryTest::testGetSlow":10.006,"ArangoDBClient\\QueryTest::testTimeoutException":10.009,"ArangoDBClient\\StatementTest::testExecuteStatement":0.004,"ArangoDBClient\\StatementTest::testStatementReturnNoWarnings":0.002,"ArangoDBClient\\StatementTest::testStatementReturnWarnings":0.002,"ArangoDBClient\\StatementTest::testStatementFailOnWarning":0.002,"ArangoDBClient\\StatementTest::testStatementFailWithMemoryLimit":0.006,"ArangoDBClient\\StatementTest::testStatisticsPeakMemoryUsage":0.004,"ArangoDBClient\\StatementTest::testStatisticsExecutionTime":3.014,"ArangoDBClient\\StatementTest::testStatisticsInsert":0.036,"ArangoDBClient\\StatementTest::testStatisticsSelectRemove":0.014,"ArangoDBClient\\StatementTest::testStatisticsSelect":0.015,"ArangoDBClient\\StatementTest::testExplainStatement":0.002,"ArangoDBClient\\StatementTest::testValidateStatement":0.002,"ArangoDBClient\\StatementTest::testExecuteStatementFlat":0.001,"ArangoDBClient\\StatementTest::testStatementThatReturnsScalarResponses":0.002,"ArangoDBClient\\StatementTest::testStatementWithFullCount":0.002,"ArangoDBClient\\StatementTest::testTtl":8.017,"ArangoDBClient\\StatementTest::testMemoryLimit":0.145,"ArangoDBClient\\StatementTest::testMaxRuntime":2.108,"ArangoDBClient\\StatementTest::testProfiling":0.019,"ArangoDBClient\\StatementTest::testStatementStreaming":0.066,"ArangoDBClient\\StatementTest::testBindReservedValue":0.003,"ArangoDBClient\\StatementTest::testBindReservedName":0.002,"ArangoDBClient\\StatementTest::testCacheAttributeTrue":0.001,"ArangoDBClient\\StatementTest::testCacheAttributeFalse":0.001,"ArangoDBClient\\StatementTest::testCacheAttributeNull":0.001,"ArangoDBClient\\StatementTest::testCacheAttributeNotSet":0.001,"ArangoDBClient\\StreamingTransactionTest::testCreateTransaction":0.003,"ArangoDBClient\\StreamingTransactionTest::testCreateAndAbortTransaction":0.002,"ArangoDBClient\\StreamingTransactionTest::testCreateAndAbortTransactionById":0.002,"ArangoDBClient\\StreamingTransactionTest::testCreateAndCommitTransaction":0.002,"ArangoDBClient\\StreamingTransactionTest::testCreateAndCommitTransactionById":0.002,"ArangoDBClient\\StreamingTransactionTest::testCreateAndGetStatusTransaction":0.002,"ArangoDBClient\\StreamingTransactionTest::testCreateAndGetStatusTransactionById":0.002,"ArangoDBClient\\StreamingTransactionTest::testGetStatusForNonExistingTransaction":0.002,"ArangoDBClient\\StreamingTransactionTest::testCreateWithCollections":0.003,"ArangoDBClient\\StreamingTransactionTest::testCreateWithCollectionsAndModes":0.002,"ArangoDBClient\\StreamingTransactionTest::testGetCollection":0.002,"ArangoDBClient\\StreamingTransactionTest::testInsert":0.002,"ArangoDBClient\\StreamingTransactionTest::testRemove":0.003,"ArangoDBClient\\StreamingTransactionTest::testUpdate":0.003,"ArangoDBClient\\StreamingTransactionTest::testReplace":0.003,"ArangoDBClient\\StreamingTransactionTest::testTruncate":0.011,"ArangoDBClient\\StreamingTransactionTest::testQuery":0.004,"ArangoDBClient\\StreamingTransactionTest::testCommitAndthenCommitTransaction":0.003,"ArangoDBClient\\StreamingTransactionTest::testCommitAndthenAbortTransaction":0.002,"ArangoDBClient\\StreamingTransactionTest::testAbortAndthenAbortTransaction":0.002,"ArangoDBClient\\StreamingTransactionTest::testAbortAndthenCommitTransaction":0.002,"ArangoDBClient\\TransactionTest::testCreateAndExecuteTransactionWithArrayInitialization":0.008,"ArangoDBClient\\TransactionTest::testCreateAndExecuteTransactionWithMagicGettersSetters":0.012,"ArangoDBClient\\TransactionTest::testCreateAndExecuteTransactionWithMagicGettersSettersAndSingleCollectionDefinitionsAsStrings":0.018,"ArangoDBClient\\TransactionTest::testCreateAndExecuteTransactionWithGettersSetters":0.01,"ArangoDBClient\\TransactionTest::testCreateAndExecuteTransactionExclusiveWithGettersSetters":0.01,"ArangoDBClient\\TransactionTest::testCreateAndExecuteTransactionWithReturnValue":0.006,"ArangoDBClient\\TransactionTest::testCreateAndExecuteTransactionWithTransactionException":0.005,"ArangoDBClient\\TransactionTest::testCreateAndExecuteTransactionWithTransactionErrorUniqueConstraintOnSave":0.004,"ArangoDBClient\\TraversalTest::testTraversalUsingDirectionOutbound":0.014,"ArangoDBClient\\TraversalTest::testTraversalUsingDirectionInbound":0.008,"ArangoDBClient\\TraversalTest::testTraversalUsingDirectionAnyAndUniquenessWithVerticesNoneAndEdgesGlobal":0.009,"ArangoDBClient\\TraversalTest::testTraversalUsingDirectionOutboundAndFilter1":0.008,"ArangoDBClient\\TraversalTest::testTraversalUsingDirectionOutboundAndFilter2":0.007,"ArangoDBClient\\TraversalTest::testTraversalUsingDirectionOutboundAndMinDepthIs2":0.008,"ArangoDBClient\\TraversalTest::testTraversalUsingDirectionOutboundAndMaxDepthIs1":0.007,"ArangoDBClient\\TraversalTest::testTraversalCountVisitedNodesAndReturnListOfNodesOnly":0.007,"ArangoDBClient\\TraversalTest::testTraversalExpandOnlyInboundOfAliceAndOutboundOfEve":0.008,"ArangoDBClient\\TraversalTest::testTraversalFollowDepthFirstStrategy":0.01,"ArangoDBClient\\TraversalTest::testTraversalUsingPostOrderOrdering":0.01,"ArangoDBClient\\TraversalTest::testTraversalUsingBackwardItemOrdering":0.01,"ArangoDBClient\\TraversalTest::testTraversalIncludeEdgesOnlyOnceGloballyButNodesEveryTimeVisited":0.008,"ArangoDBClient\\TraversalTest::testTraversalTooManyIterations":0.009,"ArangoDBClient\\UserBasicTest::testGrantPermissions":0.003,"ArangoDBClient\\UserBasicTest::testGrantAndRevokePermissions":0.002,"ArangoDBClient\\UserBasicTest::testGrantDatabasePermissions":0.002,"ArangoDBClient\\UserBasicTest::testGrantAndRevokeDatabasePermissions":0.001,"ArangoDBClient\\UserBasicTest::testGrantCollectionPermissions":0.002,"ArangoDBClient\\UserBasicTest::testGrantAndRevokeCollectionPermissions":0.001,"ArangoDBClient\\UserBasicTest::testAddReplaceUpdateGetAndDeleteUserWithNullValues":0.002,"ArangoDBClient\\UserBasicTest::testAddReplaceUpdateGetAndDeleteUserWithNonNullValues":0.001,"ArangoDBClient\\UserBasicTest::testFunctionsOnNonExistentUser":0.001,"ArangoDBClient\\ViewTest::testCreateViewObject":0.001,"ArangoDBClient\\ViewTest::testCreateView":0.001,"ArangoDBClient\\ViewTest::testGetView":0.001,"ArangoDBClient\\ViewTest::testGetNonExistingView":0,"ArangoDBClient\\ViewTest::testViewProperties":0,"ArangoDBClient\\ViewTest::testViewSetProperties":0.005,"ArangoDBClient\\ViewTest::testDropView":0.001,"ArangoDBClient\\ViewTest::testDropNonExistingView":0.001,"ArangoDBClient\\ViewTest::testRenameView":0.001,"ArangoDBClient\\ViewTest::testRenameNonExistingView":0.001,"ArangoDBClient\\CollectionBasicTest::testCreateZkdIndex":0.002,"ArangoDBClient\\CollectionBasicTest::testCreateZkdIndexGeneric":0.002}} \ No newline at end of file diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 32b76928..4ea9f01b 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -1055,6 +1055,69 @@ public function testCreateFulltextIndex() static::assertEquals('fulltextfield', $indexInfo['fields'][0], "The indexed field is not 'fulltextfield'"); static::assertEquals(5, $indexInfo[CollectionHandler::OPTION_MIN_LENGTH], 'minLength was not set to 5!'); } + + + /** + * Create a zkd index and verify it by getting information about the index from the server + */ + public function testCreateZkdIndex() + { + $result = $this->collectionHandler->createZkdIndex( + 'ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, + ['zkdfield1', 'zkdfield2'], + true + ); + + $indices = $this->collectionHandler->getIndexes('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp); + + $indicesByIdentifiers = $indices['identifiers']; + + static::assertArrayHasKey($result['id'], $indicesByIdentifiers); + + $indexInfo = $indicesByIdentifiers[$result['id']]; + + static::assertEquals( + CollectionHandler::OPTION_ZKD_INDEX, + $indexInfo[CollectionHandler::OPTION_TYPE] + ); + static::assertCount(2, $indexInfo['fields']); + static::assertEquals('zkdfield1', $indexInfo['fields'][0]); + static::assertEquals('zkdfield2', $indexInfo['fields'][1]); + static::assertTrue($indexInfo[CollectionHandler::OPTION_UNIQUE]); + static::assertFalse($indexInfo[CollectionHandler::OPTION_SPARSE]); + } + + /** + * Create a zkd index and verify it by getting information about the index from the server + */ + public function testCreateZkdIndexGeneric() + { + $result = $this->collectionHandler->createIndex( + 'ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp, [ + 'type' => 'zkd', + 'fields' => ['zkdfield1', 'zkdfield2'], + 'fieldValueTypes' => 'double', + ] + ); + + $indices = $this->collectionHandler->getIndexes('ArangoDB_PHP_TestSuite_IndexTestCollection' . '_' . static::$testsTimestamp); + + $indicesByIdentifiers = $indices['identifiers']; + + static::assertArrayHasKey($result['id'], $indicesByIdentifiers); + + $indexInfo = $indicesByIdentifiers[$result['id']]; + + static::assertEquals( + CollectionHandler::OPTION_ZKD_INDEX, + $indexInfo[CollectionHandler::OPTION_TYPE] + ); + static::assertCount(2, $indexInfo['fields']); + static::assertEquals('zkdfield1', $indexInfo['fields'][0]); + static::assertEquals('zkdfield2', $indexInfo['fields'][1]); + static::assertFalse($indexInfo[CollectionHandler::OPTION_UNIQUE]); + static::assertFalse($indexInfo[CollectionHandler::OPTION_SPARSE]); + } /** From 51c7a1dedaa1f5525445108553a90c6e8588f306 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 11 Jan 2022 17:12:25 +0100 Subject: [PATCH 086/101] add admin/log/level API --- lib/ArangoDBClient/AdminHandler.php | 40 +++++++++++++++++++ lib/ArangoDBClient/Urls.php | 5 +++ tests/AdminTest.php | 62 +++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) diff --git a/lib/ArangoDBClient/AdminHandler.php b/lib/ArangoDBClient/AdminHandler.php index 5383b481..39ab84ab 100644 --- a/lib/ArangoDBClient/AdminHandler.php +++ b/lib/ArangoDBClient/AdminHandler.php @@ -129,6 +129,46 @@ public function getServerTime() } + /** + * Get the server's current log levels + * + * This will throw if the log levels cannot be retrieved + * + * @throws Exception + * + * @return array - an array holding the various log levels + * @since 3.9 + */ + public function getServerLogLevels() + { + $url = UrlHelper::appendParamsUrl(Urls::URL_ADMIN_LOG_LEVEL, []); + $response = $this->getConnection()->get($url); + + return $response->getJson(); + } + + + /** + * Set the server's current log levels + * + * This will throw if the log levels cannot be adjusted + * + * @throws Exception + * + * @param array $levels - an array of topic => level settings + * + * @return array - an array holding the various log levels + * @since 3.9 + */ + public function setServerLogLevels(array $levels) + { + $url = UrlHelper::appendParamsUrl(Urls::URL_ADMIN_LOG_LEVEL, []); + $response = $this->getConnection()->put($url, $this->json_encode_wrapper($levels)); + + return $response->getJson(); + } + + /** * Get the server log entries * diff --git a/lib/ArangoDBClient/Urls.php b/lib/ArangoDBClient/Urls.php index 024764ef..cec0f731 100644 --- a/lib/ArangoDBClient/Urls.php +++ b/lib/ArangoDBClient/Urls.php @@ -202,6 +202,11 @@ abstract class Urls * URL for admin log entries */ const URL_ADMIN_LOG_ENTRIES = '/_admin/log/entries'; + + /** + * URL for admin log levels + */ + const URL_ADMIN_LOG_LEVEL = '/_admin/log/level'; /** * base URL part for admin routing reload (deprecated) diff --git a/tests/AdminTest.php b/tests/AdminTest.php index 1d368fa2..53302a08 100644 --- a/tests/AdminTest.php +++ b/tests/AdminTest.php @@ -98,6 +98,68 @@ public function testGetServerTime() } + /** + * Test if we can get the server log levels + */ + public function testGetServerLogLevels() + { + $result = $this->adminHandler->getServerLogLevels(); + static::assertTrue(is_array($result)); + + $levels = ["TRACE", "DEBUG", "INFO", "WARNING", "ERROR", "FATAL", "DEFAULT"]; + static::assertGreaterThan(0, count($result)); + foreach ($result as $topic => $level) { + static::assertContains($level, $levels); + } + // check a few well-known log topics + static::assertArrayHasKey('aql', $result); + static::assertArrayHasKey('threads', $result); + } + + + /** + * Test if we can set the server log levels + */ + public function testSetServerLogLevels() + { + $old = $this->adminHandler->getServerLogLevels(); + + $levels = ["TRACE", "DEBUG", "INFO", "WARNING", "ERROR", "FATAL", "DEFAULT"]; + try { + $new = ["aql" => "TRACE", "threads" => "debug"]; + + $result = $this->adminHandler->setServerLogLevels($new); + static::assertTrue(is_array($result)); + static::assertGreaterThan(0, count($result)); + foreach ($result as $topic => $level) { + static::assertContains($level, $levels); + } + static::assertEquals("TRACE", $result["aql"]); + static::assertEquals("DEBUG", $result["threads"]); + + $new = ["all" => "INFO"]; + $result = $this->adminHandler->setServerLogLevels($new); + static::assertTrue(is_array($result)); + static::assertGreaterThan(0, count($result)); + foreach ($result as $topic => $level) { + // everything must be INFO now + static::assertEquals("INFO", $level); + } + + $result = $this->adminHandler->setServerLogLevels($old); + static::assertTrue(is_array($result)); + static::assertGreaterThan(0, count($result)); + foreach ($result as $topic => $level) { + static::assertEquals($old[$topic], $level); + } + } catch (\Exception $e) { + $this->adminHandler->setServerLogLevels($old); + static::assertTrue(false, "should not end up here"); + } + + } + + /** * Test if we can get the server log * Rather dumb tests just checking that an array is returned From 6edef9988b3712d6598120637ffe7ef645cfe967 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 11 Jan 2022 17:48:12 +0100 Subject: [PATCH 087/101] added support for `fillBlockCache` statement option --- lib/ArangoDBClient/Statement.php | 43 +++++++++++++++++++++++++++ tests/StatementTest.php | 50 ++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/lib/ArangoDBClient/Statement.php b/lib/ArangoDBClient/Statement.php index b60fb7a3..856b2e10 100644 --- a/lib/ArangoDBClient/Statement.php +++ b/lib/ArangoDBClient/Statement.php @@ -165,6 +165,13 @@ class Statement */ private $_memoryLimit = 0; + /** + * Whether or not the query should populate the RocksDB block cache while reading data + * + * @var bool + */ + private $_fillBlockCache = null; + /** * transaction id (used internally) * @@ -218,6 +225,11 @@ class Statement * Memory limit threshold for query */ const ENTRY_MEMORY_LIMIT = 'memoryLimit'; + + /** + * Whether or not the query should fill the block cache while reading + */ + const ENTRY_FILL_BLOCK_CACHE = 'fillBlockCache'; /** * Full count option index @@ -328,6 +340,10 @@ public function __construct(Connection $connection, array $data) if (isset($data[self::ENTRY_MEMORY_LIMIT])) { $this->_memoryLimit = (int) $data[self::ENTRY_MEMORY_LIMIT]; } + + if (isset($data[self::ENTRY_FILL_BLOCK_CACHE])) { + $this->_fillBlockCache = (bool) $data[self::ENTRY_FILL_BLOCK_CACHE]; + } if (isset($data[self::ENTRY_TRANSACTION]) && $data[self::ENTRY_TRANSACTION] instanceof StreamingTransaction) { $this->_trxId = $data[self::ENTRY_TRANSACTION]->getId(); @@ -718,6 +734,29 @@ public function getMemoryLimit() { return $this->_memoryLimit; } + + + /** + * Set whether or not the query should populate the block cache while reading data + * + * @param bool $value - value for block cache filling option + * + * @return void + */ + public function setFillBlockCache($value = true) + { + $this->_fillBlockCache = (bool) $value; + } + + /** + * Get the configured value for block cache filling + * + * @return bool - current value of block cache filling option + */ + public function getFillBlockCache() + { + return $this->_fillBlockCache; + } /** * Set the batch size for the statement @@ -780,6 +819,10 @@ private function buildData() $data['options'][self::ENTRY_MAX_RUNTIME] = $this->_maxRuntime; } + if ($this->_fillBlockCache !== null) { + $data['options'][self::ENTRY_FILL_BLOCK_CACHE] = $this->_fillBlockCache; + } + if ($this->_ttl !== null) { $data[self::ENTRY_TTL] = $this->_ttl; } diff --git a/tests/StatementTest.php b/tests/StatementTest.php index 51360397..b3168796 100644 --- a/tests/StatementTest.php +++ b/tests/StatementTest.php @@ -178,6 +178,56 @@ public function testStatisticsPeakMemoryUsage() static::assertEquals($extra['stats']['peakMemoryUsage'], $cursor->getPeakMemoryUsage()); } + /** + * Test block cache settings + */ + public function testStatementBlockCacheGetterSetter() + { + $connection = $this->connection; + + $statement = new Statement($connection, ['query' => 'RETURN 1']); + static::assertNull($statement->getFillBlockCache()); + $statement->setFillBlockCache(); + static::assertTrue($statement->getFillBlockCache()); + $statement->setFillBlockCache(false); + static::assertFalse($statement->getFillBlockCache()); + } + + + /** + * Test block cache query + */ + public function testStatementBlockCacheEnabled() + { + $connection = $this->connection; + + $statement = new Statement($connection, ['query' => 'RETURN 1', 'fillBlockCache' => true]); + static::assertTrue($statement->getFillBlockCache()); + + // cannot really test the population of the block cache from here, as the value is only + // exposed via a server-global API and may be influenced by any other ongoing operation. + $cursor = $statement->execute(); + $extra = $cursor->getExtra(); + static::assertEquals([], $extra['warnings']); + } + + + /** + * Test block cache query + */ + public function testStatementBlockCacheDisabled() + { + $connection = $this->connection; + + $statement = new Statement($connection, ['query' => 'RETURN 1', 'fillBlockCache' => false]); + static::assertFalse($statement->getFillBlockCache()); + + // cannot really test the population of the block cache from here, as the value is only + // exposed via a server-global API and may be influenced by any other ongoing operation. + $cursor = $statement->execute(); + $extra = $cursor->getExtra(); + static::assertEquals([], $extra['warnings']); + } /** * Test statistics returned by query From 3ada51132fdb5cf29f65affdc2923933a0ff4732 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 11 Jan 2022 17:50:56 +0100 Subject: [PATCH 088/101] BE => AE --- lib/ArangoDBClient/AqlUserFunction.php | 2 +- lib/ArangoDBClient/Autoloader.php | 2 +- lib/ArangoDBClient/Cursor.php | 2 +- lib/ArangoDBClient/Statement.php | 2 +- lib/ArangoDBClient/Transaction.php | 2 +- lib/ArangoDBClient/TransactionBase.php | 2 +- lib/ArangoDBClient/Traversal.php | 6 +++--- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/ArangoDBClient/AqlUserFunction.php b/lib/ArangoDBClient/AqlUserFunction.php index 7bc252ff..40940d75 100644 --- a/lib/ArangoDBClient/AqlUserFunction.php +++ b/lib/ArangoDBClient/AqlUserFunction.php @@ -75,7 +75,7 @@ class AqlUserFunction /** - * Initialise the AqlUserFunction object + * Initialize the AqlUserFunction object * * The $attributesArray array can be used to specify the name and code for the user function in form of an array. * diff --git a/lib/ArangoDBClient/Autoloader.php b/lib/ArangoDBClient/Autoloader.php index de08917b..87c772c3 100644 --- a/lib/ArangoDBClient/Autoloader.php +++ b/lib/ArangoDBClient/Autoloader.php @@ -35,7 +35,7 @@ class Autoloader const EXTENSION = '.php'; /** - * Initialise the autoloader + * Initialize the autoloader * * @throws Exception * @return void diff --git a/lib/ArangoDBClient/Cursor.php b/lib/ArangoDBClient/Cursor.php index 816449cc..3ab867ee 100644 --- a/lib/ArangoDBClient/Cursor.php +++ b/lib/ArangoDBClient/Cursor.php @@ -176,7 +176,7 @@ class Cursor implements \Iterator const ENTRY_BASEURL = 'baseurl'; /** - * Initialise the cursor with the first results and some metadata + * Initialize the cursor with the first results and some metadata * * @param Connection $connection - connection to be used * @param array $data - initial result data as returned by the server diff --git a/lib/ArangoDBClient/Statement.php b/lib/ArangoDBClient/Statement.php index 856b2e10..dc57f667 100644 --- a/lib/ArangoDBClient/Statement.php +++ b/lib/ArangoDBClient/Statement.php @@ -257,7 +257,7 @@ class Statement const ENTRY_TRANSACTION = 'transaction'; /** - * Initialise the statement + * Initialize the statement * * The $data property can be used to specify the query text and further * options for the query. diff --git a/lib/ArangoDBClient/Transaction.php b/lib/ArangoDBClient/Transaction.php index ec18a26a..9563bf62 100644 --- a/lib/ArangoDBClient/Transaction.php +++ b/lib/ArangoDBClient/Transaction.php @@ -74,7 +74,7 @@ class Transaction extends TransactionBase protected $_action; /** - * Initialise the transaction object + * Initialize the transaction object * * The $transaction array can be used to specify the collections, action and further * options for the transaction in form of an array. diff --git a/lib/ArangoDBClient/TransactionBase.php b/lib/ArangoDBClient/TransactionBase.php index f7e3006c..f84878ef 100644 --- a/lib/ArangoDBClient/TransactionBase.php +++ b/lib/ArangoDBClient/TransactionBase.php @@ -63,7 +63,7 @@ class TransactionBase const ENTRY_EXCLUSIVE = 'exclusive'; /** - * Initialise the transaction object + * Initialize the transaction object * * @param Connection $connection - the connection to be used * diff --git a/lib/ArangoDBClient/Traversal.php b/lib/ArangoDBClient/Traversal.php index 888b4c6b..a4f1bfd3 100644 --- a/lib/ArangoDBClient/Traversal.php +++ b/lib/ArangoDBClient/Traversal.php @@ -61,11 +61,11 @@ class Traversal protected $_action; /** - * Initialise the Traversal object + * Initialize the Traversal object * * @param Connection $connection - the connection to be used - * @param string $startVertex - user function initialization data - * @param string $edgeCollection - user function initialization data + * @param string $startVertex - start vertex id for query + * @param string $edgeCollection - name of the underlying edge collection * @param array $options * * @throws \ArangoDBClient\ClientException From 00988a4695e8dee9fd997c17929f176e626fbf7d Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 11 Jan 2022 18:09:00 +0100 Subject: [PATCH 089/101] more analyzer tests --- tests/AnalyzerTest.php | 57 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tests/AnalyzerTest.php b/tests/AnalyzerTest.php index 7779ca19..d4a43e4d 100644 --- a/tests/AnalyzerTest.php +++ b/tests/AnalyzerTest.php @@ -85,6 +85,63 @@ public function testCreateTextAnalyzerFail() } static::assertEquals(400, $exception->getCode()); } + + + /** + * Test creation of segmentation analyzer + */ + public function testCreateSegmentationAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'segmentation', [ "break" => "alpha" ]); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('segmentation', $result['type']); + static::assertEquals('alpha', $result['properties']['break']); + static::assertEquals([], $analyzer->getFeatures()); + } + + + /** + * Test creation of collation analyzer + */ + public function testCreateCollationAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'collation', [ "locale" => "en.utf-8" ]); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('collation', $result['type']); + static::assertEquals('en.utf-8', $result['properties']['locale']); + static::assertEquals([], $analyzer->getFeatures()); + } + + + /** + * Test creation of geopoint analyzer + */ + public function testCreateGeoPointAnalyzer() + { + $options = [ ]; //"maxCells" => 20, "minLevel" => 4, "maxLevel" => 40 ]; + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'geopoint', [ "latitude" => ["lat"], "longitude" => ["lng"] ]); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('geopoint', $result['type']); + static::assertEquals(['lat'], $result['properties']['latitude']); + static::assertEquals(['lng'], $result['properties']['longitude']); + static::assertEquals([], $analyzer->getFeatures()); + } + + /** + * Test creation of geojson analyzer + */ + public function testCreateGeoJsonAnalyzer() + { + $analyzer = new Analyzer('Analyzer1' . '_' . static::$testsTimestamp, 'geojson', [ "type" => "point" ]); + $result = $this->analyzerHandler->create($analyzer); + static::assertEquals('Analyzer1' . '_' . static::$testsTimestamp, $result['name']); + static::assertEquals('geojson', $result['type']); + static::assertEquals('point', $result['properties']['type']); + static::assertEquals([], $analyzer->getFeatures()); + } /** * Test creation of stopwords analyzer From 2230af97d2e9c03c9109857888ec11de084f0745 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 11 Jan 2022 20:43:57 +0100 Subject: [PATCH 090/101] added some SmartGraph support --- lib/ArangoDBClient/EdgeDefinition.php | 62 +++++-- lib/ArangoDBClient/Graph.php | 249 +++++++++++++++++++++++++- lib/ArangoDBClient/GraphHandler.php | 20 ++- lib/ArangoDBClient/SmartGraph.php | 47 +++++ tests/GraphBasicTest.php | 240 +++++++++++++++++++++++++ 5 files changed, 601 insertions(+), 17 deletions(-) create mode 100644 lib/ArangoDBClient/SmartGraph.php diff --git a/lib/ArangoDBClient/EdgeDefinition.php b/lib/ArangoDBClient/EdgeDefinition.php index ed2db36d..a46863f8 100644 --- a/lib/ArangoDBClient/EdgeDefinition.php +++ b/lib/ArangoDBClient/EdgeDefinition.php @@ -44,6 +44,13 @@ class EdgeDefinition * @var array names of the end vertices collection */ protected $_toCollections = []; + + /** + * An array containing satellite collections in Hybrid SmartGraphs + * + * @var array satellite collections + */ + protected $_satellites = []; /** * Constructs an new edge definition @@ -51,19 +58,18 @@ class EdgeDefinition * @param string $relation - name of the relation (the underlying edge collection). * @param array|string $fromCollections - a list of collections providing the edges start vertices or a string holding a single collection name. * @param array|string $toCollections - a list of collections providing the edges end vertices or a string holding a single collection name. + * @param array|string $satellites - a list of satellite collections (SmartGraph only). * * @since 2.2 * */ - public function __construct($relation = null, $fromCollections = [], $toCollections = []) + public function __construct($relation = null, $fromCollections = [], $toCollections = [], $satellites = []) { $this->_relation = $relation; - $fromCollections = (array) $fromCollections; - $toCollections = (array) $toCollections; - - $this->_fromCollections = $fromCollections; - $this->_toCollections = $toCollections; + $this->_fromCollections = (array) $fromCollections; + $this->_toCollections = (array) $toCollections; + $this->_satellites = (array) $satellites; } /** @@ -111,6 +117,17 @@ public function getFromCollections() { return $this->_fromCollections; } + + /** + * Get the 'satellites' collections of the graph. + * + * @return array + * @since 3.9 + */ + public function getSatellites() + { + return $this->_satellites; + } /** * Add a 'to' collections of the graph. @@ -135,6 +152,18 @@ public function addFromCollection($fromCollection) { $this->_fromCollections[] = $fromCollection; } + + /** + * Add a 'satellite' collection of the graph. + * + * @param string $toCollection - the name of the added collection. + * + * @since 3.9 + */ + public function addSatelliteCollection($collection) + { + $this->_satellites[] = $collection; + } /** * Resets the 'to' collections of the graph. @@ -155,6 +184,16 @@ public function clearFromCollection() { return $this->_fromCollections = []; } + + /** + * Resets the 'satellites' collections of the graph. + * + * @since 3.9 + */ + public function clearSatellites() + { + return $this->_satellites = []; + } /** * Transforms an edge definition to an array. @@ -168,6 +207,7 @@ public function transformToArray() $transformedEd['collection'] = $this->getRelation(); $transformedEd['from'] = $this->getFromCollections(); $transformedEd['to'] = $this->getToCollections(); + $transformedEd['satellites'] = $this->getSatellites(); return $transformedEd; } @@ -179,13 +219,14 @@ public function transformToArray() * * @param string $relation - name of the relation (the underlying edge collection). * @param array $vertexCollections - a list of collections providing the edges start and end vertices. + * @param array $satellites - a list of satellite collections (for Hybrid SmartGraphs). * * @return EdgeDefinition * @since 2.2 */ - public static function createUndirectedRelation($relation, $vertexCollections) + public static function createUndirectedRelation($relation, $vertexCollections, array $satellites = []) { - return new EdgeDefinition($relation, $vertexCollections, $vertexCollections); + return new EdgeDefinition($relation, $vertexCollections, $vertexCollections, $satellites); } @@ -196,13 +237,14 @@ public static function createUndirectedRelation($relation, $vertexCollections) * @param string $relation - name of the relation (the underlying edge collection). * @param array|string $fromCollections - a list of collections providing the edges start vertices or a string holding a single collection name. * @param array|string $toCollections - a list of collections providing the edges end vertices or a string holding a single collection name. + * @param array|string $satellites - a list of satellite collections (for Hybrid SmartGraphs). * * @return EdgeDefinition * @since 2.2 */ - public static function createDirectedRelation($relation, $fromCollections, $toCollections) + public static function createDirectedRelation($relation, $fromCollections, $toCollections, array $satellites = []) { - return new EdgeDefinition($relation, $fromCollections, $toCollections); + return new EdgeDefinition($relation, $fromCollections, $toCollections, $satellites); } } diff --git a/lib/ArangoDBClient/Graph.php b/lib/ArangoDBClient/Graph.php index cee2dc4f..267b9225 100644 --- a/lib/ArangoDBClient/Graph.php +++ b/lib/ArangoDBClient/Graph.php @@ -1,7 +1,7 @@ set('_key', $name); } - // pass the $options to the parent constructor to do the actual work - parent::__construct($options); + foreach ($options as $key => $value) { + $this->set($key, $value); + } } @@ -139,7 +211,156 @@ public function getOrphanCollections() { return $this->_orphanCollections; } + + + /** + * Adds a satellite collection to the graph. + * + * @param string $name - name of satellite collection + * + * @return Graph + */ + public function addSatellite($name) + { + $this->_satellites[] = $name; + return $this; + } + /** + * Get the satellite collections of the graph. + * + * @return string[] + */ + public function getSatellites() + { + return $this->_satellites; + } + + /** + * Set the smart graph attribute + * + * @param string $name - smart graph attribute name + * + * @return Graph + * @since 3.9 + */ + public function setSmartGraphAttribute($name) + { + $this->set(self::ENTRY_IS_SMART_GRAPH_ATTRIBUTE, $name); + return $this; + } + + /** + * Get the smart graph attribute + * + * @return string + * @since 3.9 + */ + public function getSmartGraphAttribute() + { + return $this->_smartGraphAttribute; + } + + /** + * Set the smartness of the graph. + * + * @param bool $value - smartness value + * + * @return Graph + * @since 3.9 + */ + public function setIsSmart($value) + { + $this->set(self::ENTRY_IS_SMART, $value); + return $this; + } + + /** + * Get the smartness of the graph. + * + * @return bool + * @since 3.9 + */ + public function isSmart() + { + return $this->_isSmart; + } + + /** + * Set the disjointness of the graph. + * + * @param bool $value - disjointness value + * + * @return Graph + * @since 3.9 + */ + public function setIsDisjoint($value) + { + $this->set(self::ENTRY_IS_DISJOINT, $value); + return $this; + } + + /** + * Get the disjointness of the graph. + * + * @return bool + * @since 3.9 + */ + public function isDisjoint() + { + return $this->_isDisjoint; + } + + /** + * Set the number of shards + * + * @param int $shards - number of shards + * + * @return Graph + * @since 3.9 + */ + public function setNumberOfShards($shards) + { + $this->set(self::ENTRY_NUMBER_OF_SHARDS, $shards); + return $this; + } + + /** + * Get the number of shards + * + * @return mixed + * @since 3.9 + */ + public function getNumberOfShards() + { + return $this->_numberOfShards; + } + + + /** + * Set the replication factor + * + * @param mixed $replicationFactor - replication factor (either a number or "satellite") + * + * @return Graph + * @since 3.9 + */ + public function setReplicationFactor($value) + { + $this->set(self::ENTRY_REPLICATION_FACTOR, $value); + return $this; + } + + /** + * Get the replication factor + * + * @return mixed + * @since 3.9 + */ + public function getReplicationFactor() + { + return $this->_replicationFactor; + } /** * Set a graph attribute @@ -184,6 +405,26 @@ public function set($key, $value) foreach ($value as $o) { $this->addOrphanCollection($o); } + } else if ($key === self::ENTRY_SATELLITES) { + foreach ($value as $o) { + $this->addSatellite($o); + } + } else if ($key === self::ENTRY_NUMBER_OF_SHARDS) { + $this->_numberOfShards = (int) $value; + } else if ($key === self::ENTRY_REPLICATION_FACTOR) { + $this->_replicationFactor = $value; + } else if ($key === self::ENTRY_IS_SMART) { + if (!$value && ($this instanceof SmartGraph)) { + throw new ClientException('Cannot unset isSmart attribute of a SmartGraph'); + } + $this->_isSmart = $value; + } else if ($key === self::ENTRY_IS_DISJOINT) { + if (!($this instanceof SmartGraph)) { + throw new ClientException('Cannot set isDisjoint attribute on non-SmartGraph'); + } + $this->_isDisjoint = $value; + } else if ($key === self::ENTRY_SMART_GRAPH_ATTRIBUTE) { + $this->_smartGraphAttribute = $value; } else { parent::set($key, $value); } diff --git a/lib/ArangoDBClient/GraphHandler.php b/lib/ArangoDBClient/GraphHandler.php index c9163021..97ca5a41 100644 --- a/lib/ArangoDBClient/GraphHandler.php +++ b/lib/ArangoDBClient/GraphHandler.php @@ -112,10 +112,24 @@ public function createGraph(Graph $graph) } $params = [ - self::OPTION_NAME => $graph->getKey(), - self::OPTION_EDGE_DEFINITIONS => $edgeDefinitions, - self::OPTION_ORPHAN_COLLECTIONS => $graph->getOrphanCollections() + self::OPTION_NAME => $graph->getKey(), + self::OPTION_EDGE_DEFINITIONS => $edgeDefinitions, + self::OPTION_ORPHAN_COLLECTIONS => $graph->getOrphanCollections(), ]; + + if ($graph->isSmart()) { + $params[Graph::ENTRY_IS_SMART] = $graph->isSmart(); + $params["options"][Graph::ENTRY_IS_DISJOINT] = $graph->isDisjoint(); + $params["options"][Graph::ENTRY_SMART_GRAPH_ATTRIBUTE] = $graph->getSmartGraphAttribute(); + } + + if ($graph->getReplicationFactor() !== null) { + $params["options"][Graph::ENTRY_REPLICATION_FACTOR] = $graph->getReplicationFactor(); + } + if ($graph->getNumberOfShards() !== null) { + $params["options"][Graph::ENTRY_NUMBER_OF_SHARDS] = $graph->getNumberOfShards(); + } + $url = Urls::URL_GRAPH; $response = $this->getConnection()->post($url, $this->json_encode_wrapper($params)); $json = $response->getJson(); diff --git a/lib/ArangoDBClient/SmartGraph.php b/lib/ArangoDBClient/SmartGraph.php new file mode 100644 index 00000000..002931b8 --- /dev/null +++ b/lib/ArangoDBClient/SmartGraph.php @@ -0,0 +1,47 @@ +_isSmart = true; + } +} + +class_alias(SmartGraph::class, '\triagens\ArangoDb\SmartGraph'); diff --git a/tests/GraphBasicTest.php b/tests/GraphBasicTest.php index 32f6980e..40b77772 100644 --- a/tests/GraphBasicTest.php +++ b/tests/GraphBasicTest.php @@ -40,8 +40,248 @@ public function setUp(): void $this->connection = getConnection(); $this->collectionHandler = new CollectionHandler($this->connection); } + + + public function testInstantiateSmartGraphWithoutSmartGraphAttribute() + { + try { + new SmartGraph('Graph1' . '_' . static::$testsTimestamp); + static::assertTrue(false, "should not get here"); + } catch (\Exception $e) { + static::assertInstanceOf(ClientException::class, $e); + } + } + + + public function testInstantiateRegularSmartGraphWithSmartGraphAttribute() + { + $graph = new SmartGraph('Graph1' . '_' . static::$testsTimestamp, [ "smartGraphAttribute" => "testi" ]); + static::assertEquals("testi", $graph->getSmartGraphAttribute()); + static::assertTrue($graph->isSmart()); + static::assertFalse($graph->isDisjoint()); + } + + + public function testUnsetSmartnessOfSmartGraph() + { + $graph = new SmartGraph('Graph1' . '_' . static::$testsTimestamp, [ "smartGraphAttribute" => "testi" ]); + try { + $graph->setIsSmart(false); + static::assertTrue(false, "should not get here"); + } catch (\Exception $e) { + static::assertInstanceOf(ClientException::class, $e); + } + } + + + public function testInstantiateDisjointSmartGraph() + { + $graph = new SmartGraph('Graph1' . '_' . static::$testsTimestamp, [ "smartGraphAttribute" => "testi", "isDisjoint" => true ]); + static::assertEquals("testi", $graph->getSmartGraphAttribute()); + static::assertTrue($graph->isSmart()); + static::assertTrue($graph->isDisjoint()); + } + + + public function testCreateAndDeleteSmartRegularGraph() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + if (!isEnterprise($this->connection)) { + // don't execute this test in community version + $this->markTestSkipped("test is only meaningful in enterprise version"); + return; + } + + $param1 = []; + $param1[] = 'lba' . '_' . static::$testsTimestamp; + $param1[] = 'blub' . '_' . static::$testsTimestamp; + $param2 = []; + $param2[] = 'bla' . '_' . static::$testsTimestamp; + $param2[] = 'blob' . '_' . static::$testsTimestamp; + $ed1 = EdgeDefinition::createDirectedRelation('directed' . '_' . static::$testsTimestamp, $param1, $param2); + $ed2 = EdgeDefinition::createUndirectedRelation('undirected' . '_' . static::$testsTimestamp, 'singleV' . '_' . static::$testsTimestamp); + $this->graph = new SmartGraph('Graph1' . '_' . static::$testsTimestamp, [ "smartGraphAttribute" => "testi" ]); + $this->graph->addEdgeDefinition($ed1); + $this->graph->addEdgeDefinition($ed2); + static::assertEquals("testi", $this->graph->getSmartGraphAttribute()); + static::assertTrue($this->graph->isSmart()); + static::assertFalse($this->graph->isDisjoint()); + $this->graphHandler = new GraphHandler($this->connection); + $result = $this->graphHandler->createGraph($this->graph); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $result['_key'], 'Did not return Graph1!'); + $properties = $this->graphHandler->properties('Graph1' . '_' . static::$testsTimestamp); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $properties['_key'], 'Did not return Graph1!'); + static::assertTrue($properties['isSmart']); + static::assertFalse($properties['isDisjoint']); + static::assertEquals('testi', $properties['smartGraphAttribute']); + } + + + public function testCreateAndDeleteDisjointSmartGraph() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + if (!isEnterprise($this->connection)) { + // don't execute this test in community version + $this->markTestSkipped("test is only meaningful in enterprise version"); + return; + } + + $param1 = []; + $param1[] = 'lba' . '_' . static::$testsTimestamp; + $param1[] = 'blub' . '_' . static::$testsTimestamp; + $param2 = []; + $param2[] = 'bla' . '_' . static::$testsTimestamp; + $param2[] = 'blob' . '_' . static::$testsTimestamp; + $ed1 = EdgeDefinition::createDirectedRelation('directed' . '_' . static::$testsTimestamp, $param1, $param2); + $ed2 = EdgeDefinition::createUndirectedRelation('undirected' . '_' . static::$testsTimestamp, 'singleV' . '_' . static::$testsTimestamp); + $this->graph = new SmartGraph('Graph1' . '_' . static::$testsTimestamp, [ "smartGraphAttribute" => "testi", "isDisjoint" => true ]); + $this->graph->addEdgeDefinition($ed1); + $this->graph->addEdgeDefinition($ed2); + static::assertEquals("testi", $this->graph->getSmartGraphAttribute()); + static::assertTrue($this->graph->isSmart()); + static::assertTrue($this->graph->isDisjoint()); + $this->graphHandler = new GraphHandler($this->connection); + $result = $this->graphHandler->createGraph($this->graph); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $result['_key'], 'Did not return Graph1!'); + $properties = $this->graphHandler->properties('Graph1' . '_' . static::$testsTimestamp); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $properties['_key'], 'Did not return Graph1!'); + static::assertTrue($properties['isSmart']); + static::assertTrue($properties['isDisjoint']); + static::assertEquals('testi', $properties['smartGraphAttribute']); + } + public function testCreateAndDeleteHybridSmartGraph() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + if (!isEnterprise($this->connection)) { + // don't execute this test in community version + $this->markTestSkipped("test is only meaningful in enterprise version"); + return; + } + + $param1 = []; + $param1[] = 'lba' . '_' . static::$testsTimestamp; + $param1[] = 'blub' . '_' . static::$testsTimestamp; + $param2 = []; + $param2[] = 'bla' . '_' . static::$testsTimestamp; + $param2[] = 'blob' . '_' . static::$testsTimestamp; + $ed1 = EdgeDefinition::createDirectedRelation('directed' . '_' . static::$testsTimestamp, $param1, $param2, ['directed_' . static::$testsTimestamp]); + $ed2 = EdgeDefinition::createUndirectedRelation('undirected' . '_' . static::$testsTimestamp, 'singleV' . '_' . static::$testsTimestamp); + $this->graph = new SmartGraph('Graph1' . '_' . static::$testsTimestamp, [ "smartGraphAttribute" => "testi" ]); + $this->graph->addEdgeDefinition($ed1); + $this->graph->addEdgeDefinition($ed2); + + static::assertEquals("testi", $this->graph->getSmartGraphAttribute()); + static::assertTrue($this->graph->isSmart()); + static::assertFalse($this->graph->isDisjoint()); + $this->graphHandler = new GraphHandler($this->connection); + $result = $this->graphHandler->createGraph($this->graph); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $result['_key'], 'Did not return Graph1!'); + $properties = $this->graphHandler->properties('Graph1' . '_' . static::$testsTimestamp); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $properties['_key'], 'Did not return Graph1!'); + static::assertTrue($properties['isSmart']); + static::assertFalse($properties['isDisjoint']); + static::assertEquals('testi', $properties['smartGraphAttribute']); + } + + + public function testCreateAndDeleteSatelliteGraph() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + if (!isEnterprise($this->connection)) { + // don't execute this test in community version + $this->markTestSkipped("test is only meaningful in enterprise version"); + return; + } + + $param1 = []; + $param1[] = 'lba' . '_' . static::$testsTimestamp; + $param1[] = 'blub' . '_' . static::$testsTimestamp; + $param2 = []; + $param2[] = 'bla' . '_' . static::$testsTimestamp; + $param2[] = 'blob' . '_' . static::$testsTimestamp; + $ed1 = EdgeDefinition::createDirectedRelation('directed' . '_' . static::$testsTimestamp, $param1, $param2); + $ed2 = EdgeDefinition::createUndirectedRelation('undirected' . '_' . static::$testsTimestamp, 'singleV' . '_' . static::$testsTimestamp); + $this->graph = new Graph('Graph1' . '_' . static::$testsTimestamp, [ "replicationFactor" => "satellite" ]); + $this->graph->addEdgeDefinition($ed1); + $this->graph->addEdgeDefinition($ed2); + static::assertFalse($this->graph->isSmart()); + static::assertFalse($this->graph->isDisjoint()); + static::assertEquals(1, $this->graph->getNumberOfShards()); + static::assertEquals("satellite", $this->graph->getReplicationFactor()); + $this->graphHandler = new GraphHandler($this->connection); + $result = $this->graphHandler->createGraph($this->graph); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $result['_key'], 'Did not return Graph1!'); + $properties = $this->graphHandler->properties('Graph1' . '_' . static::$testsTimestamp); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $properties['_key'], 'Did not return Graph1!'); + static::assertFalse($properties['isSmart']); + static::assertTrue($properties['isSatellite']); + static::assertEquals("satellite", $properties['replicationFactor']); + static::assertEquals(1, $properties['numberOfShards']); + } + + + public function testCreateAndDeleteGraphWithClusterOptions() + { + if (!isCluster($this->connection)) { + // don't execute this test in a non-cluster + $this->markTestSkipped("test is only meaningful in cluster"); + return; + } + + if (!isEnterprise($this->connection)) { + // don't execute this test in community version + $this->markTestSkipped("test is only meaningful in enterprise version"); + return; + } + + $param1 = []; + $param1[] = 'lba' . '_' . static::$testsTimestamp; + $param1[] = 'blub' . '_' . static::$testsTimestamp; + $param2 = []; + $param2[] = 'bla' . '_' . static::$testsTimestamp; + $param2[] = 'blob' . '_' . static::$testsTimestamp; + $ed1 = EdgeDefinition::createDirectedRelation('directed' . '_' . static::$testsTimestamp, $param1, $param2); + $ed2 = EdgeDefinition::createUndirectedRelation('undirected' . '_' . static::$testsTimestamp, 'singleV' . '_' . static::$testsTimestamp); + $this->graph = new Graph('Graph1' . '_' . static::$testsTimestamp, [ "replicationFactor" => 2, "numberOfShards" => 4 ]); + $this->graph->addEdgeDefinition($ed1); + $this->graph->addEdgeDefinition($ed2); + static::assertFalse($this->graph->isSmart()); + static::assertFalse($this->graph->isDisjoint()); + static::assertEquals(2, $this->graph->getReplicationFactor()); + static::assertEquals(4, $this->graph->getNumberOfShards()); + $this->graphHandler = new GraphHandler($this->connection); + $result = $this->graphHandler->createGraph($this->graph); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $result['_key'], 'Did not return Graph1!'); + $properties = $this->graphHandler->properties('Graph1' . '_' . static::$testsTimestamp); + static::assertEquals('Graph1' . '_' . static::$testsTimestamp, $properties['_key'], 'Did not return Graph1!'); + static::assertFalse($properties['isSmart']); + static::assertEquals(2, $properties['replicationFactor']); + static::assertEquals(4, $properties['numberOfShards']); + } + + /** * Test creation of graph with definitions */ From 940523702c96e23b07e2281d8af2fc6b45e9e1db Mon Sep 17 00:00:00 2001 From: jsteemann Date: Thu, 3 Feb 2022 10:42:02 +0100 Subject: [PATCH 091/101] deprecation notice --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d47c7ab..5a0bd228 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,13 @@ server side, the following driver methods have been deprecated as well: - CollectionHandler::load() - CollectionHandler::unload() +It is also deprecated to create indexes of type `hash` or `skiplist` using the +`CollectionHandler::createIndex()` method. Instead, the generic index type `persistent` +should be used when calling this method. +Please also note that the dedicated methods `CollectionHandler::createHashIndex()` and +`CollectionHandler::createSkipListIndex()` for creating hash or skiplist indexes are +deprecated since 3.5 already. + ## Release notes for the ArangoDB-PHP driver 3.8.x OPTION_TIMEOUT of the Connection class is now superseded by the more specialized options From 00e25f3ef0515310b2352151cba345f26af52460 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 7 Feb 2022 09:45:57 +0100 Subject: [PATCH 092/101] fix metrics handling after server-side change --- lib/ArangoDBClient/AdminHandler.php | 31 ++++++++++++++++------------- lib/ArangoDBClient/Urls.php | 2 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/lib/ArangoDBClient/AdminHandler.php b/lib/ArangoDBClient/AdminHandler.php index 39ab84ab..4be9f631 100644 --- a/lib/ArangoDBClient/AdminHandler.php +++ b/lib/ArangoDBClient/AdminHandler.php @@ -292,6 +292,7 @@ public function getServerMetrics() if (trim($line) == "") { continue; } + if ($line[0] == "#") { // type or help if (!preg_match("/^#\s*([^\s]+)\s+([^\s]+)\s+(.*)$/", $line, $matches)) { @@ -306,10 +307,10 @@ public function getServerMetrics() $metrics[$metric][strtolower($matches[1])] = $matches[3]; } else { // metric value - if (!preg_match("/^([^\s]+?)(\{.*?\})?\s+(.+)$\s*$/", $line, $matches)) { + if (!preg_match("/^([^\s\{]+)(\{.*?\})?\s*(.+)$\s*$/", $line, $matches)) { throw new ClientException('Invalid metrics API output line: "' . $line. '"'); } - + $metric = $matches[1]; $sub = null; if (preg_match("/_(sum|count|bucket)$/", $metric, $sub)) { @@ -325,23 +326,25 @@ public function getServerMetrics() // labels if ($matches[2] != "") { $labels = substr($matches[2], 1, strlen($matches[2]) - 2); - foreach (explode(",", $labels) as $label) { - $parts = explode("=", $label); - $key = trim($parts[0]); - $value = trim($parts[1], " \""); - if (!isset($metrics[$metric]["labels"])) { - $metrics[$metric]["labels"] = []; - } - if ($key != "le") { - $metrics[$metric]["labels"][$key] = $value; - } else { - $le = $value; + if ($labels != "") { + foreach (explode(",", $labels) as $label) { + $parts = explode("=", $label); + $key = trim($parts[0]); + $value = trim($parts[1], " \""); + if (!isset($metrics[$metric]["labels"])) { + $metrics[$metric]["labels"] = []; + } + if ($key != "le") { + $metrics[$metric]["labels"][$key] = $value; + } else { + $le = $value; + } } } } // cast to number - $value = $matches[3] + 0; + $value = $matches[3]; if ($sub == null) { // counter diff --git a/lib/ArangoDBClient/Urls.php b/lib/ArangoDBClient/Urls.php index cec0f731..d4530e29 100644 --- a/lib/ArangoDBClient/Urls.php +++ b/lib/ArangoDBClient/Urls.php @@ -216,7 +216,7 @@ abstract class Urls /** * base URL part for admin statistics */ - const URL_ADMIN_METRICS = '/_admin/metrics/v2'; + const URL_ADMIN_METRICS = '/_admin/metrics'; /** * base URL part for admin statistics (deprecated) From f78586605f100e4c11793633b9bddd23bf8317bb Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 26 Jul 2022 13:56:54 +0200 Subject: [PATCH 093/101] fix failing tests --- tests/CollectionBasicTest.php | 11 ++++++----- tests/StatementTest.php | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/tests/CollectionBasicTest.php b/tests/CollectionBasicTest.php index 4ea9f01b..957fc82d 100644 --- a/tests/CollectionBasicTest.php +++ b/tests/CollectionBasicTest.php @@ -265,12 +265,13 @@ public function testCreateCollectionWithKeyOptionsCluster() ['type' => 'autoincrement', 'allowUserKeys' => false, 'increment' => 5, 'offset' => 10] ); - try { - $collectionHandler->create($collection); - } catch (\Exception $e) { - } + $response = $collectionHandler->create($collection); + $resultingCollection = $collectionHandler->getProperties($response); + $properties = $resultingCollection->getAll(); - static::assertEquals(501, $e->getCode()); + static::assertEquals("autoincrement", $properties["keyOptions"]["type"]); + static::assertEquals(10, $properties["keyOptions"]["offset"]); + static::assertEquals(5, $properties["keyOptions"]["increment"]); } diff --git a/tests/StatementTest.php b/tests/StatementTest.php index b3168796..572cadec 100644 --- a/tests/StatementTest.php +++ b/tests/StatementTest.php @@ -274,7 +274,11 @@ public function testStatisticsInsert() 'writesIgnored' => 0, 'scannedFull' => 0, 'scannedIndex' => 0, - 'filtered' => 0 + 'filtered' => 0, + 'cursorsCreated' => 0, + 'cursorsRearmed' => 0, + 'cacheHits' => 0, + 'cacheMisses' => 0, ], filtered($extra['stats']) ); @@ -312,7 +316,11 @@ public function testStatisticsSelectRemove() 'writesIgnored' => 0, 'scannedFull' => 0, 'scannedIndex' => 3, - 'filtered' => 0 + 'filtered' => 0, + 'cursorsCreated' => 1, + 'cursorsRearmed' => 0, + 'cacheHits' => 0, + 'cacheMisses' => 0, ], filtered($extra['stats']) ); @@ -350,7 +358,11 @@ public function testStatisticsSelect() 'writesIgnored' => 0, 'scannedFull' => 1000, 'scannedIndex' => 0, - 'filtered' => 500 + 'filtered' => 500, + 'cursorsCreated' => 0, + 'cursorsRearmed' => 0, + 'cacheHits' => 0, + 'cacheMisses' => 0, ], filtered($extra['stats']) ); From 1817ecf8e7032906afaa48d229d0a2c2e1a44d87 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Fri, 19 Aug 2022 13:55:25 +0200 Subject: [PATCH 094/101] update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a0bd228..6b7c1064 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## Release notes for the ArangoDB-PHP driver 3.10.x + + ## Release notes for the ArangoDB-PHP driver 3.9.x This version of the PHP driver is compatible with PHP versions 7.4 and 8.0. From efe2f51eb77032441d920f180236c99e49061419 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 27 Sep 2022 16:13:39 +0200 Subject: [PATCH 095/101] fix test for 3.11 --- tests/StatementTest.php | 57 ++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/tests/StatementTest.php b/tests/StatementTest.php index 572cadec..be5c9fdc 100644 --- a/tests/StatementTest.php +++ b/tests/StatementTest.php @@ -270,15 +270,16 @@ public function testStatisticsInsert() static::assertEquals( [ - 'writesExecuted' => 1000, - 'writesIgnored' => 0, - 'scannedFull' => 0, - 'scannedIndex' => 0, - 'filtered' => 0, - 'cursorsCreated' => 0, - 'cursorsRearmed' => 0, - 'cacheHits' => 0, - 'cacheMisses' => 0, + 'writesExecuted' => 1000, + 'writesIgnored' => 0, + 'scannedFull' => 0, + 'scannedIndex' => 0, + 'filtered' => 0, + 'cursorsCreated' => 0, + 'cursorsRearmed' => 0, + 'cacheHits' => 0, + 'cacheMisses' => 0, + 'intermediateCommits' => 0, ], filtered($extra['stats']) ); @@ -312,15 +313,16 @@ public function testStatisticsSelectRemove() static::assertEquals( [ - 'writesExecuted' => 3, - 'writesIgnored' => 0, - 'scannedFull' => 0, - 'scannedIndex' => 3, - 'filtered' => 0, - 'cursorsCreated' => 1, - 'cursorsRearmed' => 0, - 'cacheHits' => 0, - 'cacheMisses' => 0, + 'writesExecuted' => 3, + 'writesIgnored' => 0, + 'scannedFull' => 0, + 'scannedIndex' => 3, + 'filtered' => 0, + 'cursorsCreated' => 1, + 'cursorsRearmed' => 0, + 'cacheHits' => 0, + 'cacheMisses' => 0, + 'intermediateCommits' => 0, ], filtered($extra['stats']) ); @@ -354,15 +356,16 @@ public function testStatisticsSelect() static::assertEquals( [ - 'writesExecuted' => 0, - 'writesIgnored' => 0, - 'scannedFull' => 1000, - 'scannedIndex' => 0, - 'filtered' => 500, - 'cursorsCreated' => 0, - 'cursorsRearmed' => 0, - 'cacheHits' => 0, - 'cacheMisses' => 0, + 'writesExecuted' => 0, + 'writesIgnored' => 0, + 'scannedFull' => 1000, + 'scannedIndex' => 0, + 'filtered' => 500, + 'cursorsCreated' => 0, + 'cursorsRearmed' => 0, + 'cacheHits' => 0, + 'cacheMisses' => 0, + 'intermediateCommits' => 0, ], filtered($extra['stats']) ); From add25271e057be7e111024919ca7ddc674ecc814 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 27 Sep 2022 16:30:22 +0200 Subject: [PATCH 096/101] disable exception logging for certain check functions --- lib/ArangoDBClient/CollectionHandler.php | 11 +++++++++++ lib/ArangoDBClient/DocumentHandler.php | 11 +++++++++++ lib/ArangoDBClient/Exception.php | 24 ++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/lib/ArangoDBClient/CollectionHandler.php b/lib/ArangoDBClient/CollectionHandler.php index 80f52c0e..3cfd0aec 100644 --- a/lib/ArangoDBClient/CollectionHandler.php +++ b/lib/ArangoDBClient/CollectionHandler.php @@ -379,12 +379,23 @@ public function has($collection) { $collection = $this->makeCollection($collection); + // get current exception logging status, and then turn it off + // temporarily + $old = Exception::getLogging(); + Exception::setLogging(false); + try { // will throw ServerException if entry could not be retrieved $this->get($collection); + + // restore previous Exception logging status + Exception::setLogging($old); return true; } catch (ServerException $e) { + // restore previous Exception logging status + Exception::setLogging($old); + // we are expecting a 404 to return boolean false if ($e->getCode() === 404) { return false; diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index 2024e269..7592814a 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -107,12 +107,23 @@ public function get($collection, $documentId, array $options = []) */ public function has($collection, $documentId) { + // get current exception logging status, and then turn it off + // temporarily + $old = Exception::getLogging(); + Exception::setLogging(false); + try { // will throw ServerException if entry could not be retrieved $this->get($collection, $documentId); + // restore previous Exception logging status + Exception::setLogging($old); + return true; } catch (ServerException $e) { + // restore previous Exception logging status + Exception::setLogging($old); + // we are expecting a 404 to return boolean false if ($e->getCode() === 404) { return false; diff --git a/lib/ArangoDBClient/Exception.php b/lib/ArangoDBClient/Exception.php index 5299088a..01b22f9a 100644 --- a/lib/ArangoDBClient/Exception.php +++ b/lib/ArangoDBClient/Exception.php @@ -40,12 +40,32 @@ public function __construct($message = '', $code = 0, \Exception $previous = nul parent::__construct($message, $code, $previous); } + /** + * Get the current exception logging status + * + * @return boolean - current exception logging status + */ + public static function getLogging() + { + return self::$enableLogging; + } + + + /** + * Set the current exception logging status + * @param bool $enable - whether or not to enable logging + */ + public static function setLogging($enable) + { + self::$enableLogging = $enable; + } + /** * Turn on exception logging */ public static function enableLogging() { - self::$enableLogging = true; + self::setLogging(true); } /** @@ -53,7 +73,7 @@ public static function enableLogging() */ public static function disableLogging() { - self::$enableLogging = false; + self::setLogging(false); } private static $enableLogging = false; From f8c39bae48169571182f1320ef210dcfb8fa990e Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 27 Sep 2022 16:33:28 +0200 Subject: [PATCH 097/101] update docs --- CHANGELOG.md | 3 +++ README.md | 5 ----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b7c1064..29130e64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## Release notes for the ArangoDB-PHP driver 3.10.x +This version of the PHP driver is compatible with PHP version 8.1. +Older versions of PHP are not supported. + ## Release notes for the ArangoDB-PHP driver 3.9.x diff --git a/README.md b/README.md index 3ccb423a..c4cc6ee5 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,6 @@ The official ArangoDB PHP Driver. -3.6: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=3.6)](https://travis-ci.com/arangodb/arangodb-php) -3.7: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=3.7)](https://travis-ci.com/arangodb/arangodb-php) -3.8: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=3.8)](https://travis-ci.com/arangodb/arangodb-php) -devel: [![Build Status](https://api.travis-ci.com/arangodb/arangodb-php.svg?branch=devel)](https://travis-ci.com/arangodb/arangodb-php) - - [Getting Started](https://www.arangodb.com/docs/stable/drivers/php-getting-started.html) - [Tutorial](https://www.arangodb.com/docs/stable/drivers/php-tutorial.html) From 5cd5a1a0d6cb1277efd0c73f7808924c9c52a13e Mon Sep 17 00:00:00 2001 From: jsteemann Date: Tue, 27 Sep 2022 16:43:52 +0200 Subject: [PATCH 098/101] do not log exceptions --- lib/ArangoDBClient/DocumentHandler.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/ArangoDBClient/DocumentHandler.php b/lib/ArangoDBClient/DocumentHandler.php index 7592814a..a33becfa 100644 --- a/lib/ArangoDBClient/DocumentHandler.php +++ b/lib/ArangoDBClient/DocumentHandler.php @@ -950,12 +950,20 @@ protected function lazyCreateCollection($collection, $options) $params['waitForSync'] = $options['waitForSync']; } + // get current exception logging status, and then turn it off + // temporarily + $old = Exception::getLogging(); + Exception::setLogging(false); + try { // attempt to create the collection $collectionHandler->create($collection, $params); } catch (Exception $e) { // collection may have existed already } + + // restore previous Exception logging status + Exception::setLogging($old); } } From 01593b817cb3183f813698f509e0e9387dbb7c13 Mon Sep 17 00:00:00 2001 From: Tom Regner Date: Fri, 21 Oct 2022 16:34:35 +0200 Subject: [PATCH 099/101] FoxxHandler api update / php 8.1 (#296) --- .travis.yml | 1 + lib/ArangoDBClient/ConnectionOptions.php | 178 ++++----- lib/ArangoDBClient/Cursor.php | 5 + lib/ArangoDBClient/Document.php | 1 + lib/ArangoDBClient/FoxxHandler.php | 356 +++++++++++++++++- lib/ArangoDBClient/HttpHelper.php | 51 ++- lib/ArangoDBClient/Multipart.php | 82 ++++ lib/ArangoDBClient/OptionHelper.php | 119 ++++++ lib/ArangoDBClient/Urls.php | 29 +- tests/FoxxBasicTest.php | 43 ++- .../demo-hello-foxx-upgrade.zip | Bin 0 -> 291216 bytes tests/travis/setup_arangodb.sh | 4 + 12 files changed, 729 insertions(+), 140 deletions(-) create mode 100644 lib/ArangoDBClient/Multipart.php create mode 100644 lib/ArangoDBClient/OptionHelper.php create mode 100644 tests/files_for_tests/demo-hello-foxx-upgrade.zip diff --git a/.travis.yml b/.travis.yml index 038230e7..97e48b1c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,7 @@ matrix: include: - php: '7.4' - php: '8.0' + - php: '8.1' before_script: - chmod 777 ./tests/travis/setup_arangodb.sh diff --git a/lib/ArangoDBClient/ConnectionOptions.php b/lib/ArangoDBClient/ConnectionOptions.php index a1bd61ae..062567d9 100644 --- a/lib/ArangoDBClient/ConnectionOptions.php +++ b/lib/ArangoDBClient/ConnectionOptions.php @@ -21,15 +21,8 @@ * @package ArangoDBClient * @since 0.2 */ -class ConnectionOptions implements \ArrayAccess +class ConnectionOptions extends OptionHelper { - /** - * The current options - * - * @var array - */ - private $_values = []; - /** * The index into the endpoints array that we will connect to (or are currently * connected to). This index will be increased in case the currently connected @@ -268,17 +261,15 @@ class ConnectionOptions implements \ArrayAccess * * @throws \ArangoDBClient\ClientException */ - public function __construct(array $options) - { - $this->_values = array_merge(self::getDefaults(), $options); - - if (isset($this->_values[self::OPTION_ENDPOINT]) && - !is_array($this->_values[self::OPTION_ENDPOINT])) { - $this->_values[self::OPTION_ENDPOINT] = [ $this->_values[self::OPTION_ENDPOINT] ]; + final protected function init(array $options) { + $this->values = array_merge(self::getDefaults(), $options); + + if (isset($this->values[self::OPTION_ENDPOINT]) && + !is_array($this->values[self::OPTION_ENDPOINT])) { + $this->values[self::OPTION_ENDPOINT] = [ $this->values[self::OPTION_ENDPOINT] ]; } $this->loadOptionsFromCache(); - $this->validate(); } /** @@ -288,10 +279,10 @@ public function __construct(array $options) */ public function getAll() { - return $this->_values; + return $this->values; } - /** + /** * Set and validate a specific option, necessary for ArrayAccess * * @throws Exception @@ -303,60 +294,15 @@ public function getAll() */ public function offsetSet($offset, $value) { - $this->_values[$offset] = $value; + $this->values[$offset] = $value; if ($offset === self::OPTION_CONNECT_TIMEOUT || $offset === self::OPTION_REQUEST_TIMEOUT) { // special handling for OPTION_TIMEOUT: it will be removed once // a more specialized option is used - unset($this->_values[self::OPTION_TIMEOUT]); + unset($this->values[self::OPTION_TIMEOUT]); } $this->validate(); } - /** - * Check whether an option exists, necessary for ArrayAccess - * - * @param string $offset -name of option - * - * @return bool - true if option exists, false otherwise - */ - public function offsetExists($offset) - { - return isset($this->_values[$offset]); - } - - /** - * Remove an option and validate, necessary for ArrayAccess - * - * @throws Exception - * - * @param string $offset - name of option - * - * @return void - */ - public function offsetUnset($offset) - { - unset($this->_values[$offset]); - $this->validate(); - } - - /** - * Get a specific option, necessary for ArrayAccess - * - * @throws ClientException - * - * @param string $offset - name of option - * - * @return mixed - value of option, will throw if option is not set - */ - public function offsetGet($offset) - { - if (!array_key_exists($offset, $this->_values)) { - throw new ClientException('Invalid option ' . $offset); - } - - return $this->_values[$offset]; - } - /** * Get the current endpoint to use * @@ -364,8 +310,8 @@ public function offsetGet($offset) */ public function getCurrentEndpoint() { - assert(is_array($this->_values[self::OPTION_ENDPOINT])); - return $this->_values[self::OPTION_ENDPOINT][$this->_currentEndpointIndex]; + assert(is_array($this->values[self::OPTION_ENDPOINT])); + return $this->values[self::OPTION_ENDPOINT][$this->_currentEndpointIndex]; } /** @@ -375,8 +321,8 @@ public function getCurrentEndpoint() */ public function haveMultipleEndpoints() { - assert(is_array($this->_values[self::OPTION_ENDPOINT])); - return count($this->_values[self::OPTION_ENDPOINT]) > 1; + assert(is_array($this->values[self::OPTION_ENDPOINT])); + return count($this->values[self::OPTION_ENDPOINT]) > 1; } /** @@ -396,9 +342,9 @@ public function addEndpoint($endpoint) $endpoint = Endpoint::normalize($endpoint); $normalized = Endpoint::normalizeHostname($endpoint); - assert(is_array($this->_values[self::OPTION_ENDPOINT])); + assert(is_array($this->values[self::OPTION_ENDPOINT])); $found = false; - foreach ($this->_values[self::OPTION_ENDPOINT] as $key => $value) { + foreach ($this->values[self::OPTION_ENDPOINT] as $key => $value) { if ($normalized === Endpoint::normalizeHostname($value)) { $this->_currentEndpointIndex = $key; $found = true; @@ -408,8 +354,8 @@ public function addEndpoint($endpoint) if ($found === false) { // a new endpoint we have not seen before - $this->_values[self::OPTION_ENDPOINT][] = $endpoint; - $this->_currentEndpointIndex = count($this->_values[self::OPTION_ENDPOINT]) - 1; + $this->values[self::OPTION_ENDPOINT][] = $endpoint; + $this->_currentEndpointIndex = count($this->values[self::OPTION_ENDPOINT]) - 1; } $this->storeOptionsInCache(); @@ -423,8 +369,8 @@ public function addEndpoint($endpoint) */ public function nextEndpoint() { - assert(is_array($this->_values[self::OPTION_ENDPOINT])); - $endpoints = $this->_values[self::OPTION_ENDPOINT]; + assert(is_array($this->values[self::OPTION_ENDPOINT])); + $endpoints = $this->values[self::OPTION_ENDPOINT]; $numberOfEndpoints = count($endpoints); @@ -515,40 +461,42 @@ private static function getSupportedConnectionTypes() * @throws ClientException * @return void - will throw if an invalid option value is found */ - private function validate() + final protected function validate() { - if (isset($this->_values[self::OPTION_HOST]) && !is_string($this->_values[self::OPTION_HOST])) { + + + if (isset($this->values[self::OPTION_HOST]) && !is_string($this->values[self::OPTION_HOST])) { throw new ClientException('host should be a string'); } - if (isset($this->_values[self::OPTION_PORT]) && !is_int($this->_values[self::OPTION_PORT])) { + if (isset($this->values[self::OPTION_PORT]) && !is_int($this->values[self::OPTION_PORT])) { throw new ClientException('port should be an integer'); } // can use either endpoint or host/port - if (isset($this->_values[self::OPTION_HOST], $this->_values[self::OPTION_ENDPOINT])) { + if (isset($this->values[self::OPTION_HOST], $this->values[self::OPTION_ENDPOINT])) { throw new ClientException('must not specify both host and endpoint'); } - if (isset($this->_values[self::OPTION_HOST]) && !isset($this->_values[self::OPTION_ENDPOINT])) { + if (isset($this->values[self::OPTION_HOST]) && !isset($this->values[self::OPTION_ENDPOINT])) { // upgrade host/port to an endpoint - $this->_values[self::OPTION_ENDPOINT] = [ 'tcp://' . $this->_values[self::OPTION_HOST] . ':' . $this->_values[self::OPTION_PORT] ]; - unset($this->_values[self::OPTION_HOST]); + $this->values[self::OPTION_ENDPOINT] = [ 'tcp://' . $this->values[self::OPTION_HOST] . ':' . $this->values[self::OPTION_PORT] ]; + unset($this->values[self::OPTION_HOST]); } - if (!is_array($this->_values[self::OPTION_ENDPOINT])) { + if (!is_array($this->values[self::OPTION_ENDPOINT])) { // make sure that we always have an array of endpoints - $this->_values[self::OPTION_ENDPOINT] = [ $this->_values[self::OPTION_ENDPOINT] ]; + $this->values[self::OPTION_ENDPOINT] = [ $this->values[self::OPTION_ENDPOINT] ]; } - assert(is_array($this->_values[self::OPTION_ENDPOINT])); - foreach ($this->_values[self::OPTION_ENDPOINT] as $key => $value) { - $this->_values[self::OPTION_ENDPOINT][$key] = Endpoint::normalize($value); + assert(is_array($this->values[self::OPTION_ENDPOINT])); + foreach ($this->values[self::OPTION_ENDPOINT] as $key => $value) { + $this->values[self::OPTION_ENDPOINT][$key] = Endpoint::normalize($value); } - if (count($this->_values[self::OPTION_ENDPOINT]) > 1) { + if (count($this->values[self::OPTION_ENDPOINT]) > 1) { // when we have more than a single endpoint, we must always use the reconnect option - $this->_values[ConnectionOptions::OPTION_RECONNECT] = true; + $this->values[ConnectionOptions::OPTION_RECONNECT] = true; } // validate endpoint @@ -560,48 +508,48 @@ private function validate() $type = Endpoint::getType($ep); if ($type === Endpoint::TYPE_UNIX) { // must set port to 0 for UNIX domain sockets - $this->_values[self::OPTION_PORT] = 0; + $this->values[self::OPTION_PORT] = 0; } elseif ($type === Endpoint::TYPE_SSL) { // must set port to 0 for SSL connections - $this->_values[self::OPTION_PORT] = 0; + $this->values[self::OPTION_PORT] = 0; } else { if (preg_match("/:(\d+)$/", $ep, $match)) { // get port number from endpoint, to not confuse developers when dumping // connection details - $this->_values[self::OPTION_PORT] = (int) $match[1]; + $this->values[self::OPTION_PORT] = (int) $match[1]; } } - if (isset($this->_values[self::OPTION_AUTH_TYPE]) && !in_array( - $this->_values[self::OPTION_AUTH_TYPE], + if (isset($this->values[self::OPTION_AUTH_TYPE]) && !in_array( + $this->values[self::OPTION_AUTH_TYPE], self::getSupportedAuthTypes(), true ) ) { throw new ClientException('unsupported authorization method'); } - if (isset($this->_values[self::OPTION_CONNECTION]) && !in_array( - $this->_values[self::OPTION_CONNECTION], + if (isset($this->values[self::OPTION_CONNECTION]) && !in_array( + $this->values[self::OPTION_CONNECTION], self::getSupportedConnectionTypes(), true ) ) { throw new ClientException( sprintf( "unsupported connection value '%s'", - $this->_values[self::OPTION_CONNECTION] + $this->values[self::OPTION_CONNECTION] ) ); } - if (isset($this->_values[self::OPTION_TIMEOUT])) { + if (isset($this->values[self::OPTION_TIMEOUT])) { // propagate values from OPTION_TIMOEUT into OPTION_CONNECT_TIMEOUT and OPTION_REQUEST_TIMEOUT - $this->_values[self::OPTION_CONNECT_TIMEOUT] = (float) $this->_values[self::OPTION_TIMEOUT]; - $this->_values[self::OPTION_REQUEST_TIMEOUT] = (float) $this->_values[self::OPTION_TIMEOUT]; + $this->values[self::OPTION_CONNECT_TIMEOUT] = (float) $this->values[self::OPTION_TIMEOUT]; + $this->values[self::OPTION_REQUEST_TIMEOUT] = (float) $this->values[self::OPTION_TIMEOUT]; } - UpdatePolicy::validate($this->_values[self::OPTION_UPDATE_POLICY]); - UpdatePolicy::validate($this->_values[self::OPTION_REPLACE_POLICY]); - UpdatePolicy::validate($this->_values[self::OPTION_DELETE_POLICY]); + UpdatePolicy::validate($this->values[self::OPTION_UPDATE_POLICY]); + UpdatePolicy::validate($this->values[self::OPTION_REPLACE_POLICY]); + UpdatePolicy::validate($this->values[self::OPTION_DELETE_POLICY]); } @@ -619,11 +567,11 @@ private function loadOptionsFromCache() return; } - $endpoints = $cache->get($this->_values[self::OPTION_MEMCACHED_ENDPOINTS_KEY]); + $endpoints = $cache->get($this->values[self::OPTION_MEMCACHED_ENDPOINTS_KEY]); if ($endpoints) { - $this->_values[self::OPTION_ENDPOINT] = $endpoints; - if (!is_array($this->_values[self::OPTION_ENDPOINT])) { - $this->_values[self::OPTION_ENDPOINT] = [ $this->_values[self::OPTION_ENDPOINT] ]; + $this->values[self::OPTION_ENDPOINT] = $endpoints; + if (!is_array($this->values[self::OPTION_ENDPOINT])) { + $this->values[self::OPTION_ENDPOINT] = [ $this->values[self::OPTION_ENDPOINT] ]; } } } @@ -635,7 +583,7 @@ private function loadOptionsFromCache() */ private function storeOptionsInCache() { - $endpoints = $this->_values[self::OPTION_ENDPOINT]; + $endpoints = $this->values[self::OPTION_ENDPOINT]; $numberOfEndpoints = count($endpoints); if ($numberOfEndpoints <= 1) { @@ -655,9 +603,9 @@ private function storeOptionsInCache() } } - $ttl = (int) $this->_values[self::OPTION_MEMCACHED_TTL]; - $cache->set($this->_values[self::OPTION_MEMCACHED_ENDPOINTS_KEY], $update, $ttl); - } + $ttl = (int) $this->values[self::OPTION_MEMCACHED_TTL]; + $cache->set($this->values[self::OPTION_MEMCACHED_ENDPOINTS_KEY], $update, $ttl); + } /** * Initialize and return a memcached cache instance, @@ -668,14 +616,14 @@ private function storeOptionsInCache() private function getEndpointsCache() { if ($this->_cache === null) { - if (!isset($this->_values[self::OPTION_MEMCACHED_SERVERS])) { + if (!isset($this->values[self::OPTION_MEMCACHED_SERVERS])) { return null; } if (!class_exists('Memcached', false)) { return null; } - $servers = $this->_values[self::OPTION_MEMCACHED_SERVERS]; + $servers = $this->values[self::OPTION_MEMCACHED_SERVERS]; if (!is_array($servers)) { throw new ClientException('Invalid memcached servers list. should be an array of servers'); } @@ -685,8 +633,8 @@ private function getEndpointsCache() $cache->addServers($servers); } - if (isset($this->_values[self::OPTION_MEMCACHED_OPTIONS])) { - $options = $this->_values[self::OPTION_MEMCACHED_OPTIONS]; + if (isset($this->values[self::OPTION_MEMCACHED_OPTIONS])) { + $options = $this->values[self::OPTION_MEMCACHED_OPTIONS]; if (!is_array($options)) { throw new ClientException('Invalid memcached options list. should be an array of options'); } diff --git a/lib/ArangoDBClient/Cursor.php b/lib/ArangoDBClient/Cursor.php index 3ab867ee..0dba21df 100644 --- a/lib/ArangoDBClient/Cursor.php +++ b/lib/ArangoDBClient/Cursor.php @@ -323,6 +323,7 @@ public function getAll() * * @return void */ + #[\ReturnTypeWillChange] public function rewind() { $this->_position = 0; @@ -334,6 +335,7 @@ public function rewind() * * @return array - the current result row as an assoc array */ + #[\ReturnTypeWillChange] public function current() { return $this->_result[$this->_position]; @@ -345,6 +347,7 @@ public function current() * * @return int - the current result row index */ + #[\ReturnTypeWillChange] public function key() { return $this->_position; @@ -356,6 +359,7 @@ public function key() * * @return void */ + #[\ReturnTypeWillChange] public function next() { ++$this->_position; @@ -371,6 +375,7 @@ public function next() * @throws Exception * @return bool - true if the cursor can be advanced further, false if cursor is at end */ + #[\ReturnTypeWillChange] public function valid() { if ($this->_position <= $this->_length - 1) { diff --git a/lib/ArangoDBClient/Document.php b/lib/ArangoDBClient/Document.php index 095c057d..4f821008 100644 --- a/lib/ArangoDBClient/Document.php +++ b/lib/ArangoDBClient/Document.php @@ -786,6 +786,7 @@ public function getRevision() * * @return array - array of all document attributes/values */ + #[\ReturnTypeWillChange] public function jsonSerialize(array $options = []) { return $this->getAll($options); diff --git a/lib/ArangoDBClient/FoxxHandler.php b/lib/ArangoDBClient/FoxxHandler.php index 6388b0cd..5a05926d 100644 --- a/lib/ArangoDBClient/FoxxHandler.php +++ b/lib/ArangoDBClient/FoxxHandler.php @@ -6,10 +6,18 @@ * @package ArangoDBClient * @author Tom Regner * @copyright Copyright 2016, triagens GmbH, Cologne, Germany + * @copyright Copyright 2022, ArangoDB GmbH, Cologne, Germany */ namespace ArangoDBClient; +use ArangoDBClient\HttpHelper; +use ArangoDBClient\Urls; +use ArangoDBClient\UrlHelper; +use ArangoDBClient\ServerException; +use ArangoDBClient\ClientException; +use ArangoDBClient\Multipart; + /** * A class for uploading Foxx application zips to a database * @@ -18,6 +26,65 @@ */ class FoxxHandler extends Handler { + /* Field names */ + + /** + * Name of the dependencie field + */ + const FOXX_APP_DEPENDENCIES = 'dependencies'; + /** + * Name of the configuration field + */ + const FOXX_APP_CONFIGURATION = 'configuration'; + + /* Url parameter names */ + + /** + * Name of the setup parameter + */ + const FOXX_APP_SETUP = 'setup'; + /** + * Name of the teardown parameter + */ + const FOXX_APP_TEARDOWN = 'teardown'; + /** + * Name of the legacy parameter + */ + const FOXX_APP_LEGACY = 'legacy'; + /** + * Name of development parameter + */ + const FOXX_APP_DEVELOPMENT = 'development'; + + /** + * Name of the force parameter + */ + const FOXX_APP_FORCE = 'force'; + + /** + * Name of the exclude system parameter + */ + const FOXX_APP_EXCLUDE_SYSTEM = 'excludeSystem'; + + /* Default values and custom consts */ + + /** + * Default values for the options above + */ + const FOXX_APP_DEFAULT_PARAMS = [ + self::FOXX_APP_DEVELOPMENT => false, + self::FOXX_APP_LEGACY => false, + self::FOXX_APP_SETUP => true, + self::FOXX_APP_TEARDOWN => true, + self::FOXX_APP_FORCE => false, + self::FOXX_APP_EXCLUDE_SYSTEM => true, + ]; + + /** + * Multipart boundary for foxx app api calls + */ + const FOXX_APP_MIME_BOUNDARY = 'XXXfoxxhandlerXXX'; + /** * Upload and install a foxx app. * @@ -25,34 +92,179 @@ class FoxxHandler extends Handler * * @param string $localZip - the path to the local foxx-app zip-archive to upload/install * @param string $mountPoint - the mount-point for the app, must begin with a '/' - * @param array $options - for future usage + * @param array $options - You can pass configuration (array), dependencies (array) and control options + * (bool) legacy, development, setup, teardown + * Defaults are + * - configuration empty + * - dependencies empty + * - control options: see FoxxHandler::FOXX_APP_DEFAULT_PARAMS * * @return array - the server response * * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * @deprecated Use installService() */ public function installFoxxZip($localZip, $mountPoint, array $options = []) + { + $this->installService($localZip, $mountPoint, $options); + } + + /** + * Upload and install a foxx app. + * + * @throws ClientException + * + * @param string $localZip - the path to the local foxx-app zip-archive to upload/install + * @param string $mountPoint - the mount-point for the app, must begin with a '/' + * @param array $options - You can pass configuration (array), dependencies (array) and control options + * (bool) legacy, development, setup, teardown + * Defaults are + * - configuration empty + * - dependencies empty + * - control options: see FoxxHandler::FOXX_APP_DEFAULT_PARAMS + * + * @return array - the server response + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function installService($localZip, $mountPoint, array $options = []) + { + return $this->zipAction($localZip, $mountPoint, $options, false, false); + } + + /** + * Upload a zip amd upgrade an existing service. + * + * @throws ClientException + * + * @param string $localZip - the path to the local foxx-app zip-archive to upload/install + * @param string $mountPoint - the mount-point for the app, must begin with a '/' + * @param array $options - You can pass configuration (array), dependencies (array) and control options + * (bool) legacy, development, setup, teardown, force + * Defaults are + * - configuration empty + * - dependencies empty + * - control options: see FoxxHandler::FOXX_APP_DEFAULT_PARAMS + * + * @return array - the server response + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function upgradeService($localZip, $mountPoint, array $options = []) + { + return $this->zipAction($localZip, $mountPoint, $options, true, false); + } + + /** + * Upload a zip amd replace an existing service. + * + * @throws ClientException + * + * @param string $localZip - the path to the local foxx-app zip-archive to upload/install + * @param string $mountPoint - the mount-point for the app, must begin with a '/' + * @param array $options - You can pass configuration (array), dependencies (array) and control options + * (bool) legacy, development, setup, teardown, force + * Defaults are + * - configuration empty + * - dependencies empty + * - control options: see FoxxHandler::FOXX_APP_DEFAULT_PARAMS + * + * @return array - the server response + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function replaceService($localZip, $mountPoint, array $options = []) + { + return $this->zipAction($localZip, $mountPoint, $options, false, true); + } + + /** + * Install/Upgrade/Replace a foxx service via zip-bundle + * + * @throws ClientException + * + * @param string $localZip - the path to the local foxx-app zip-archive to upload/install + * @param string $mountPoint - the mount-point for the app, must begin with a '/' + * @param array $options - You can pass configuration (array), dependencies (array) and control options + * @param bool $upgrade - If true, try to upgrade an existing service, if this is true, $replace will be ignored + * @param bool $replace - if true replace an existing service; if $upgrade is true, this will be ignored + */ + protected function zipAction($localZip, $mountPoint, array $options, bool $upgrade = false, bool $replace = false) { if (!file_exists($localZip)) { throw new ClientException("Foxx-Zip {$localZip} does not exist (or file is unreadable)."); } + $dependencies = []; + if (!empty($options[self::FOXX_APP_DEPENDENCIES])) { + $dependencies = $options[self::FOXX_APP_DEPENDENCIES]; + unset($options[self::FOXX_APP_DEPENDENCIES]); + } + $configuration = []; + if (!empty($options[self::FOXX_APP_CONFIGURATION])) { + $configuration = $options[self::FOXX_APP_CONFIGURATION]; + unset($options[self::FOXX_APP_CONFIGURATION]); + } + try { - $post = file_get_contents($localZip); - $response = $this->getConnection()->post(Urls::URL_UPLOAD, $post); + $post = file_get_contents($localZip); + $bodyParts = [ + new Multipart([ + Multipart::MULTIPART_NAME => 'configuration', + Multipart::MULTIPART_VALUE => json_encode($configuration, JSON_FORCE_OBJECT), + ]), + new Multipart([ + Multipart::MULTIPART_NAME => 'dependencies', + Multipart::MULTIPART_VALUE => json_encode($dependencies, JSON_FORCE_OBJECT), + ]), + new Multipart([ + Multipart::MULTIPART_NAME => 'source', + Multipart::MULTIPART_VALUE => $post, + Multipart::MULTIPART_TRANSFER_ENCODING => Multipart::MULTIPART_ENCODING_BINARY, + Multipart::MULTIPART_FILENAME => basename($localZip), - if ($response->getHttpCode() < 400) { - $response = $this->getConnection()->put(Urls::URL_FOXX_INSTALL, json_encode(['appInfo' => $response->getJson()['filename'], 'mount' => $mountPoint])); - if ($response->getHttpCode() < 400) { - return $response->getJson(); + ]), + ]; + $bodyStr = HttpHelper::buildMultiPartFormDataBody(self::FOXX_APP_MIME_BOUNDARY, ...$bodyParts); + $optionNames = [self::FOXX_APP_LEGACY, self::FOXX_APP_DEVELOPMENT, self::FOXX_APP_SETUP]; + if (true === $upgrade|| true === $replace) { + $optionNames[] = self::FOXX_APP_FORCE; + } + $params = static::buildParameterArray($optionNames, $mountPoint, $options); + if (true === $upgrade) { + $response = $this->getConnection()->patch( + UrlHelper::appendParamsUrl(Urls::URL_FOXX_UPGRADE, $params), + $bodyStr, + ["Content-Type" => "multipart/form-data; boundary=" . self::FOXX_APP_MIME_BOUNDARY] + ); + } elseif (true === $replace) { + $response = $this->getConnection()->put( + UrlHelper::appendParamsUrl(Urls::URL_FOXX_REPLACE, $params), + $bodyStr, + ["Content-Type" => "multipart/form-data; boundary=" . self::FOXX_APP_MIME_BOUNDARY] + ); + } else { + $response = $this->getConnection()->post( + UrlHelper::appendParamsUrl(Urls::URL_FOXX_INSTALL, $params), + $bodyStr, + ["Content-Type" => "multipart/form-data; boundary=" . self::FOXX_APP_MIME_BOUNDARY] + ); + } + $code = $response->getHttpCode(); + $response = $response->getJson(); + if (true === $upgrade || true === $replace) { + if (200 !== $code) { + throw new ClientException("Foxx-Zip replace/upgrade failed: {$response['errorMessage']} (errno {$response['errorNum']})"); + } + } else { + if (201 !== $code) { + throw new ClientException("Foxx-Zip install failed: {$response['errorMessage']} (errno {$response['errorNum']})"); } - - throw new ClientException('Foxx-Zip install failed'); } - throw new ClientException('Foxx-Zip upload failed'); + return $response; } catch (ServerException $e) { - throw new ClientException($e->getMessage()); + throw new ClientException($e); } } @@ -62,17 +274,38 @@ public function installFoxxZip($localZip, $mountPoint, array $options = []) * @throws ClientException * * @param string $mountPoint - the mount-point for the app, must begin with a '/' - * @param array $options - for future usage + * @param array $options - you can pass the control option teardown (bool) * * @return array - the server response * * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * @deprecated use uninstallService() */ public function removeFoxxApp($mountPoint, array $options = []) { + return $this->uninstallService($mountPoint, $options); + } + + /** + * Remove a foxx-app. + * + * @throws ClientException + * + * @param string $mountPoint - the mount-point for the app, must begin with a '/' + * @param array $options - you can pass the control option teardown (bool) + * + * @return array - the server response + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function uninstallService($mountPoint, array $options = []) + { + try { - $response = $this->getConnection()->put(Urls::URL_FOXX_UNINSTALL, json_encode(['mount' => $mountPoint])); - if ($response->getHttpCode() < 400) { + $params = static::buildParameterArray([self::FOXX_APP_TEARDOWN], $mountPoint, $options); + $url = UrlHelper::appendParamsUrl(Urls::URL_FOXX_UNINSTALL, $params); + $response = $this->getConnection()->delete($url); + if ($response->getHttpCode() === 204) { return $response->getJson(); } @@ -84,6 +317,101 @@ public function removeFoxxApp($mountPoint, array $options = []) throw new ClientException($e->getMessage()); } } + + /** + * Retrieve a list of meta data for all installed services + * + * @throws ClientException + * + * @param array $options - you cann pass the option excludeSystem (bool) + * + * @return array - the server response + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function services(array $options = []) + { + + try { + $params = static::buildParameterArray([self::FOXX_APP_EXCLUDE_SYSTEM], '', $options); + $url = UrlHelper::appendParamsUrl(Urls::URL_FOXX, $params); + $response = $this->getConnection()->get($url); + $code = $response->getHttpCode(); + if (200 === $code) { + return $response->getJson(); + } + + throw new ClientException(sprintf('Error when fetching services meta data (Code: %d)', $response->getHttpCode()), $response->getJson()); + } catch (ServerException $e) { + if ($e->getMessage() === 'Service not found') { + throw new ClientException(sprintf('Mount point %s not present.', $mountPoint)); + } + throw new ClientException($e->getMessage()); + } + } + + /** + * Retrieve service meta data + * + * @throws ClientException + * + * @param string $mountPoint - the mount-point for the app, must begin with a '/' + * @param array $options - for future use + * + * @return array - the server response + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function serviceInfo($mountPoint, array $options = []) + { + + try { + $params = static::buildParameterArray([], $mountPoint, $options); + $url = UrlHelper::appendParamsUrl(Urls::URL_FOXX_SERVICE, $params); + $response = $this->getConnection()->get($url); + $code = $response->getHttpCode(); + if (200 === $code) { + return $response->getJson(); + } elseif (400 === $code) { + throw new ClientException("Service unknown: {$mountPoint}"); + } + + throw new ClientException(sprintf('Error when fetching service meta data (Code: %d)', $response->getHttpCode()), $response->getJson()); + } catch (ServerException $e) { + if ($e->getMessage() === 'Service not found') { + throw new ClientException(sprintf('Mount point %s not present.', $mountPoint)); + } + throw new ClientException($e->getMessage()); + } + } + + /** + * Build an array of url parameters. + * + * Parameter names found in $options are removed from the array. + * + * @param array $names the names of the parameters to determin the value for + * @param string $mountPoint Mount point of the foxx app to affect + * @param array $options pass values to use here, if not present defaults will be used. + * + * @return array + */ + protected static function buildParameterArray(array $names, string $mountPoint, array &$options) + { + $params = !empty($mountPoint) ? ['mount' => $mountPoint] : []; + foreach ($names as $param) { + if (isset($options[$param])) { + $params[$param] = $options[$param]; + unset($options[$param]); + } elseif (array_key_exists($param, static::FOXX_APP_DEFAULT_PARAMS)) { + $params[$param] = self::FOXX_APP_DEFAULT_PARAMS[$param]; + } else { + throw new ClientException("Unknown option '{$param}'."); + } + } + + return $params; + } } class_alias(FoxxHandler::class, '\triagens\ArangoDb\FoxxHandler'); diff --git a/lib/ArangoDBClient/HttpHelper.php b/lib/ArangoDBClient/HttpHelper.php index e768f601..74784d94 100644 --- a/lib/ArangoDBClient/HttpHelper.php +++ b/lib/ArangoDBClient/HttpHelper.php @@ -10,6 +10,8 @@ namespace ArangoDBClient; +use ArangoDBClient\Multipart; + /** * Helper methods for HTTP request/response handling * @@ -18,6 +20,21 @@ */ class HttpHelper { + /** + * Content-Disposition Handler + */ + const HEADER_CONTENT_DISPOSITION = 'Content-Disposition'; + + /** + * Content-Type Handler + */ + const HEADER_CONTENT_TYPE = 'Content-Type'; + + /** + * Content-Transfer-Encoding Handler + */ + const HEADER_CONTENT_TRANSFER_ENCODING = 'Content-Transfer-Encoding'; + /** * HTTP POST string constant */ @@ -154,13 +171,16 @@ public static function buildRequest(ConnectionOptions $options, $connectionHeade $length = strlen($body); if ($options[ConnectionOptions::OPTION_BATCH] === true) { - $contentType = 'Content-Type: multipart/form-data; boundary=' . self::MIME_BOUNDARY . self::EOL; + $contentType = self::HEADER_CONTENT_TYPE . ': multipart/form-data; boundary=' . self::MIME_BOUNDARY . self::EOL; } else { $contentType = ''; - if ($length > 0 && $options[ConnectionOptions::OPTION_BATCHPART] === false) { + if (!empty($customHeaders[self::HEADER_CONTENT_TYPE])) { + $contentType = self::HEADER_CONTENT_TYPE . ': ' . $customHeaders[self::HEADER_CONTENT_TYPE] . self::EOL; + unset($customHeaders[self::HEADER_CONTENT_TYPE]); + } elseif ($length > 0 && $options[ConnectionOptions::OPTION_BATCHPART] === false) { // if body is set, we should set a content-type header - $contentType = 'Content-Type: application/json' . self::EOL; + $contentType = self::HEADER_CONTENT_TYPE . ': application/json' . self::EOL; } } @@ -339,6 +359,31 @@ public static function parseHeaders($headers) return [$httpCode, $result, $processed]; } + + /** + * Process an array of multipart descriptions into the complete request body + * + * $parts Multipart objects. + * + * @param string $boundary + * @param Multipart ...$parts + * + * @return string + */ + public static function buildMultiPartFormDataBody(string $boundary = self::MIME_BOUNDARY, Multipart ...$parts) + { + $bodyStr = ""; + foreach ($parts as $data) { + $name = $data[Multipart::MULTIPART_NAME]; + $bodyStr .= Multipart::MULTIPART_PREFIX . "{$boundary}" . self::EOL . self::HEADER_CONTENT_DISPOSITION . ":" . Multipart::MULTIPART_FORMDATA . "; " . Multipart::MULTIPART_NAME . "=\"{$name}\""; + $bodyStr .= !empty($data[Multipart::MULTIPART_FILENAME]) ? "; ". Multipart::MULTIPART_FILENAME . "=\"{$data[Multipart::MULTIPART_FILENAME]}\"" : ''; + $bodyStr .= !empty($data[Multipart::MULTIPART_MIMETYPE]) ? self::EOL . self::HEADER_CONTENT_TYPE . ": {$data[Multipart::MULTIPART_MIMETYPE]}" : ''; + $bodyStr .= !empty($data[Multipart::MULTIPART_TRANSFER_ENCODING]) ? self::EOL . self::HEADER_CONTENT_TRANSFER_ENCODING . ": {$data[Multipart::MULTIPART_TRANSFER_ENCODING]}" : ''; + $bodyStr .= self::EOL . self::EOL . $data[Multipart::MULTIPART_VALUE] . self::EOL; + } + + return $bodyStr . Multipart::MULTIPART_PREFIX . $boundary . Multipart::MULTIPART_SUFFIX . self::EOL; + } } class_alias(HttpHelper::class, '\triagens\ArangoDb\HttpHelper'); diff --git a/lib/ArangoDBClient/Multipart.php b/lib/ArangoDBClient/Multipart.php new file mode 100644 index 00000000..c88c7b99 --- /dev/null +++ b/lib/ArangoDBClient/Multipart.php @@ -0,0 +1,82 @@ + + * @copyright Copyright 2022, ArangoDB GmbH, Cologne, Germany + */ +class Multipart extends OptionHelper +{ + /** + * Multipart prefix + */ + const MULTIPART_PREFIX = '--'; + + /** + * Multipart suffix + */ + const MULTIPART_SUFFIX = self::MULTIPART_PREFIX; + + /** + * Multipart form-data mime type + */ + const MULTIPART_FORMDATA = 'form-data'; + + /** + * Content-Type attribute filename + */ + const MULTIPART_FILENAME = 'filename'; + + /** + * Content-Transfer-Encoding attribute filename + */ + const MULTIPART_TRANSFER_ENCODING = 'transfer-encoding'; + + /** + * Content-Type attribute name + */ + const MULTIPART_NAME = 'name'; + + /** + * Content-Type + */ + const MULTIPART_MIMETYPE = 'mime-type'; + + /** + * Identifies the parts content + */ + const MULTIPART_VALUE = 'value'; + + /** + * Transfer encoding binary + */ + const MULTIPART_ENCODING_BINARY = 'binary'; + + /** + * Transfer encoding base64 + */ + const MULTIPART_ENCODING_BASE64 = 'base64'; + + /** + * Transfer encoding quoted-printable + */ + const MULTIPART_ENCODING_QUOTED_PRINTABLE = 'quoted-printable'; + + /** + * Unneeded for now. + * @return void + * @throws ClientException + */ + final protected function validate() + { + if (!empty($this->values[self::MULTIPART_MIMETYPE]) && empty($this->values[self::MULTIPART_FILENAME])) { + throw new ClientException("Mimetype must only be set for file-type fields; '". self::MULTIPART_FILENAME . "' missing."); + } + if (!empty($this->values[self::MULTIPART_TRANSFER_ENCODING]) && empty($this->values[self::MULTIPART_FILENAME])) { + throw new ClientException("Transfer encoding must only be set for file-type fields; '". self::MULTIPART_FILENAME . "' missing."); + } + } +} diff --git a/lib/ArangoDBClient/OptionHelper.php b/lib/ArangoDBClient/OptionHelper.php new file mode 100644 index 00000000..ff01d66b --- /dev/null +++ b/lib/ArangoDBClient/OptionHelper.php @@ -0,0 +1,119 @@ + + * @copyright Copyright 2022, ArangoDB GmbH, Cologne, Germany + */ + +namespace ArangoDBClient; + +/** + * + */ +abstract class OptionHelper implements \ArrayAccess +{ + /** + * The current options + * + * @var array + */ + protected $values = []; + + /** + * This function is called after potentially modifying method calls. + * Implement it not empty to ensure consistency if necessary, implement it + * empty otherwise. + */ + abstract protected function validate(); + + /** + * Set defaults, use options provided by client and validate them + * @param array $options + */ + protected function init(array $options) + { + foreach ($options as $name => $value) { + $this->values[$name] = $value; + } + } + + /** + * Create and initialize the options instance. + * @param array $options + * @throws \ArangoDBClient\ClientException + */ + public function __construct(array $options) + { + $this->init($options); + $this->validate(); + } + + /** + * Set and validate a specific option, necessary for ArrayAccess + * + * @throws Exception + * + * @param string $offset - name of option + * @param mixed $value - value for option + * + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetSet($offset, $value) + { + $this->values[$offset] = $value; + $this->validate(); + } + + /** + * Check whether an option exists, necessary for ArrayAccess + * + * @param string $offset -name of option + * + * @return bool - true if option exists, false otherwise + */ + #[\ReturnTypeWillChange] + public function offsetExists($offset) + { + return isset($this->values[$offset]); + } + + /** + * Remove an option and validate, necessary for ArrayAccess + * + * @throws Exception + * + * @param string $offset - name of option + * + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetUnset($offset) + { + unset($this->values[$offset]); + $this->validate(); + } + + /** + * Get a specific option, necessary for ArrayAccess + * + * @throws ClientException + * + * @param string $offset - name of option + * + * @return mixed - value of option, will throw if option is not set + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + if (!array_key_exists($offset, $this->values)) { + throw new ClientException('Invalid option ' . $offset); + } + + return $this->values[$offset]; + } + +} diff --git a/lib/ArangoDBClient/Urls.php b/lib/ArangoDBClient/Urls.php index d4530e29..04e11648 100644 --- a/lib/ArangoDBClient/Urls.php +++ b/lib/ArangoDBClient/Urls.php @@ -263,15 +263,40 @@ abstract class Urls */ const URL_UPLOAD = '/_api/upload'; + /** + * foxx base URL + */ + const URL_FOXX = '/_api/foxx'; + /** * URL for foxx-app installations */ - const URL_FOXX_INSTALL = '/_admin/foxx/install'; + const URL_FOXX_INSTALL = self::URL_FOXX; + + /** + * foxx service url + */ + const URL_FOXX_SERVICE = '/_api/foxx/service'; + + /** + * URL for foxx-app installations + */ + const URL_FOXX_UNINSTALL = self::URL_FOXX_SERVICE; + + /** + * URL for foxx-app installations + */ + const URL_FOXX_REPLACE = self::URL_FOXX_SERVICE; /** * URL for foxx-app deinstallation */ - const URL_FOXX_UNINSTALL = '/_admin/foxx/uninstall'; + const URL_FOXX_UPGRADE = self::URL_FOXX_SERVICE; + + /** + * foxx service configuration URL + */ + const URL_FOXX_CONFIGURATION = '/_api/foxx/configuration'; } class_alias(Urls::class, '\triagens\ArangoDb\Urls'); diff --git a/tests/FoxxBasicTest.php b/tests/FoxxBasicTest.php index 62f7e24a..814508a5 100644 --- a/tests/FoxxBasicTest.php +++ b/tests/FoxxBasicTest.php @@ -21,6 +21,8 @@ class FoxxBasicTest extends \PHPUnit_Framework_TestCase { + private FoxxHandler $foxxHandler; + public function setUp(): void { $this->connection = getConnection(); @@ -28,7 +30,7 @@ public function setUp(): void try { // ignore errors - $this->foxxHandler->removeFoxxApp('/hello_world'); + $this->foxxHandler->uninstallService('/hello_world'); } catch (ClientException $e) { // ignore } @@ -42,11 +44,38 @@ public function testUploadAndInstallFoxxApp() { $foxxHandler = $this->foxxHandler; $zip = __DIR__ . '/files_for_tests/demo-hello-foxx-master.zip'; - $response = $foxxHandler->installFoxxZip($zip, '/hello_world'); - static::assertEquals(200, (int) $response['code'], 'Status not 200'); + $upgradeZip = __DIR__ . '/files_for_tests/demo-hello-foxx-upgrade.zip'; + $response = $foxxHandler->installService($zip, '/hello_world'); + static::assertEquals('2.0.0', $response['version'], 'Wrong version'); + static::assertEquals('/hello_world', $response['mount'], 'Wrong mountpoint'); + $response = $foxxHandler->replaceService($zip, '/hello_world'); + static::assertEquals('2.0.0', $response['version'], 'Wrong version'); + static::assertEquals('/hello_world', $response['mount'], 'Wrong mountpoint'); + $response = $foxxHandler->upgradeService($upgradeZip, '/hello_world'); static::assertEquals('/hello_world', $response['mount'], 'Wrong mountpoint'); + static::assertEquals('2.0.1', $response['version'], 'Wrong version'); } + /** + * Fetch service meta data two ways + */ + public function testServiceInfo() + { + $foxxHandler = $this->foxxHandler; + $zip = __DIR__ . '/files_for_tests/demo-hello-foxx-master.zip'; + $expected = [ + 'mount' => '/hello_world', + 'name' => 'hello-foxx', + 'version' => '2.0.0', + 'development' => false, + 'legacy' => false, + ]; + $foxxHandler->installService($zip, '/hello_world'); + $response = $foxxHandler->serviceInfo("/hello_world"); + static::assertEquals(array_intersect_assoc($response, $expected), $expected); + $response = $foxxHandler->services(); + static::assertEquals(array_intersect_assoc($response[0], $expected), $expected); + } /** * Try to upload and install a non-existing app */ @@ -55,16 +84,18 @@ public function testUploadAndInstallNonExistingFoxxApp() $this->expectException(\ArangoDBClient\ClientException::class); $foxxHandler = $this->foxxHandler; $zip = __DIR__ . '/files_for_tests/move_along.zip'; - $foxxHandler->installFoxxZip($zip, '/move_along'); + $foxxHandler->installService($zip, '/move_along'); } - + /** + * cleanup and remove the service + */ public function tearDown(): void { $foxxHandler = $this->foxxHandler; try { // ignore errors - $foxxHandler->removeFoxxApp('/hello_world'); + $foxxHandler->uninstallService('/hello_world'); } catch (ClientException $e) { // ignore } diff --git a/tests/files_for_tests/demo-hello-foxx-upgrade.zip b/tests/files_for_tests/demo-hello-foxx-upgrade.zip new file mode 100644 index 0000000000000000000000000000000000000000..c9107f8052533df5ec9584d6bb9ea6a517225ca2 GIT binary patch literal 291216 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⪼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%0D1Y2P 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

    linkhttps://docs.arangodb.com/HTTP/Traversal/index.htmlhttps://www.arangodb.com/docs/stable/http/traversal.html
    package|;D7Q93i!1ZWb{N{a#7=Gy$Vsmi(1pc853Zf7pGX~h6rTNt^g9IAF#;p zn&)f7=f&_>cXIIRd^Qk&UdMVg`QxVy!LCgSTthbQDm#W~++7HAH-IMsEMXHt)FZ5- zn!W_^Lwhv`f12pMKnwah@a4{`s*icZXOC$=bOWW6#}L#Bd_DljZndH#aA5;nwYuw~ zk85N;VPhVVYI?k~*P^r)G>nVlg*rIkrnBfw5@nf@5B>Mtf=_@0gmm67yxpRoEv7E7 zG(S4X*xYsDAA-kr+A9xL<5J!IAx4$jOzt>tF;LHDkk3~RTXMMfFryN_^nn&OGO3WU z=!4)AuLJ1J{4=rEx@XUhh18fgNINdMc|q0b6HIh;HyhobXWB+!B@Di!85%x=E3fLK zmSNY+-Pk68r8aDc5lK8B{ldw9HkeDTkWoK?Xe25!{AC33H$)J;S78%@Tu+2DzT<@> ze{zBDZ4sKeJKN&LQisyP*$zFUVkK$n#{n+utrYqz&=Ly$*eO#19;HfL*d|Is1TeUh zV{=@D4)d~_#$c=cnGUjrc{OY*L?Of!k0%A#F;o6nicr;d5RkO!Y|oQ;DFk11u0q*z zO~IFo<5}dp{U~p9AtB z))uV4-J{^xX`04%p^DcRa0`NjJ*GAW+zSF30V4#QSP=S%L102d01HLUN^-kWdw8Wd zT8tr&IxPge@X-Q+qv|n31Wr9@xT$G>WF(w|lF~x-ny^N&2vyC+A?8vpwJdH|i%<-V zp5s91`WRsNQwe;ehCQ}~XZJ|6^Ae-e;Jhxd4{l#?J1FBu$SS5))ImWo5FuC@v|Nj7+c@cPg|-YiM6IwJy%jNSa?erR1=$)&kU zCdO`Q@vjnAgdJm*0KzKNARy2_uwIOiNa5k#R~zC^>i2gfSLem)onPALLZx} zVe#Ck5#+$9VIby1!&>+>yqYWf5fQtPx9K!P@Ii)H9HFnRQq5>gkJvse6X58GD<72dKRlUA`LF)Lf_$g)}(Ar2j8 znFVsaSpI@q+gTQ%D4J1BbU{L;eTQbWw?BvxN(}@!D<-Y z%n+&BAN6|W%89<)zJU9gV?Ym7hMiM`oVOv?Bl{Q+P>m^@`4q@!5@64MY zJIGqVp`reZ&ZXI$VJ{WSn3a8t#9L>fxdCzVEtfP;7Skd1@l@ho5JC7pQ_fvNuN+=6 zhrVq90!1xM$Ha6lQ^!yNvbtqNHDrPzx`RhodT#}wzp6+kH4Gx{@G;Gvm@pJ{dK@il z@|*xMN7<$U(?H0g2;tjU-Gb59ZRo??(h0ia+oD##Wy&8>dMFhOCsx ztyUNTKy^JEa+0V>T})Bw65GXs0lq!LQwSYmGO`@MSfq_`TSnb4q#2zu{-+kIGYWxp zV|<*g9`id8Rl!}4{h3{p>|OqfTPiTe=RcIt)1g#ShXFPyIgb@GRIM?|fOt|*tf`hw zv@=e=45ToFU>kwT=tLQVBr53tES^B27y>^#PCHaxXot&$w{Ox@-!2*! z?B$JH1UXUOkWr{U1Kdm<1B9OkRK$C$z!A~9xEi$@sRKU%QMckhyor-c>tA0sP7+|p zB+v~b0i|SKZZVxe=94Rv%$0lnGC>MX)_1lKyNrt;9|c z7*#W!{^RWui8ovgo#LptT^Zm~IEv=0G;NvD=cj6_ujboeBjZJ%dMxYd)yzGz9)hM+Bp1pubR z`?@`P&_Sm6i@h7MTFZV$Hf7ZbnLup$ep(%9){0*(#a|<~!GY04_GTZn=CSee>f2GN zF%=C7N9O4c-HpM`BBbYtsF$Z34ud#+7#xBW5vDk1RaI$l*1}?rNKeExqDDXU*3_af z6cje6APnBLV#KK4lZ@_WB{*aep1b`!%ibV^qV&YJRQ|?@rc982(`DP3L=1=(xQm@- zvVXrWb`P4J`p0sirs)_e_di~LCTceX)Vc4{STn&O6Ul6D|l0}a-tO-mU~wYCX5MRJ z0r%b+a8}0v=@C9lPS{psY)-(X(Z)v=b9|YuveB#wWLBGnUDhk99PJ8cd_fI}Ah6 zxvYJW?2`RgMOm6eUCldr6mv{7v~;XD>qczueVFZDIyO5@;hSPz+Jzre~n7I7t#hgb)-y3kiKlJBhqU0 zcNR6kI{jC+F}K2c0GAbzIE)!Rn7@oOY7>u##c6X9%ej3zBUt@AVUAPFA+zj4Ne>GmW@HfvY0lKoGm>Ey$9m(VeYOI89Bg{LajK`1Ce&>a`Di=A;g z%W)*?kMLsbU=?#nA$z?tY*&A8LAiKb8|69yU+$d{3Ll?@_#{%GW3g|qh&=(c(lt6q zTBUwUeK|4)cZt-q!DQpKM?i{ZUeOjB4<+3no&jM{e{Ks)Aw7Dt6vd5{a`xC8kq^X7 z+kJ)Mc{n3TtXu9T!Ab;um`Ho;q0%+@hG$QSRRlQ5CoXJCYbO(y325(2v?PG+rupE4OR4a4>h_q!g!DrYYGlroBmj+ug5i-Wle( z8SWOHnI1l)vVU;AMmFTHsm|8JWzh2wQx5&aQPgirzK=Hc(nujDYdv-ki2rcl z46F-{;UuyX=NzO2mDeqL==cVV#C48@=^~kGLNAwk>PJ}Bd@Gc*PN-T9tRz`yK4>uc zJ9?~Q#$QfosjMW~V{xtFr0r`vxKOUWcA`dCz4l-lqcXM;5|3!ctlsfa>^B2R!m81P z7K44&MtNuAd6kVo@(!~dQ)oX?v$OQnHsLu-6eJtHYj6eEB*RkRG9`gi<{NA7g0Di+!R*#-iPZTTA5ToE5@Q3G?WsT5oca0_Bit27JBrANJIwE(Sm- zLJmEkOOZvVwr2OPvu69Pb_|E~dMI+#zWt(0ql$$7`U~6wSHW4MYzr$EJBZ@u(Q;rN zLstA<)g0Vcg+pLpO))|M!cIn367XiB71mg5pk*(WBckYq%-;tLgQR+}Yvpfvuu26u zUv7@|7qRaI4b&>ssDr9za2t1Z`vhq<8hTf78X}+$Z+JCEw`Jj(LX$Jpq7G~x-CNhj z88g@`DBG*<|IQPV05osHB?1JDwpkNw@@}T%BLRjzhlHiVG5uSiP-)$J+;Qqq9TaGk z503P$XdC*4(xfeW_M&ZkYH@C+sxyLW`j#2_{wOSKolr=2G9mSuO*`C0wG=VQ$-~&` zLrmV0d49&!8(So_D*TC4YWkO>fpED8%6ki^QHi#2CO|x0gI6pFcjK{_yX?S zk4>Xj1UK^sfx)k|lSEZ$x-OB?rOZr9GpcBdDNMi7lCHFjLbV!ABh>LG6yw`47Ufa6 zsWE*9fp+e9gJ=6o-r%H{@DrP=4M1>h@Xh?+A#g0fKQGMC)n;M5HZFEd5{cD`KDyIod^ zYYEt3sztv9!k>2ixCge^oznQB0SCB^;sB2YX4?L$2+YJn4?6!L@8A2|HnKc%_;2x5 zKy+qIS|la;7MqHqb$sdeb{uD7r_=MuN*WR&2{B2q3DU9>d0zYP-0KtoQgXUycK7r2 z?!**OsC%6{*Y6>ILf=_zQ7>^JLEUf)Mj4*As`m^VRO5EZSyVqTr&WD0SQOvF6(*rW ze5uzSJ7P{g8aeBxoCQ2RV;gwg8-&D_Mwbwz?qs_lRuS!=JM_zJx+q^d--X;vLGlZA zS*HKcqv9Ii2YJP=wBDS!f&GF$A@{2e2IA-e4Uv^FII6UQ1xr5K-`B_+Gcz3nyZYV? zN8v*C#whMnUXjQC$GW0=br!eMF@_JJ?wSUJ6QB>Gn!&Yh#Y6cQO}UA> zGR(YZfBc`B`2WrhDQgvUlJ3A^jJ_AB~v@kN>UN5BWLDy>uFj#pZDzRK+M<$QJ=$gCqk~!rFqr6 zz@HVSWy1PFS#KkcS68lonsu` z-gF*``Ls4KdBkOSHRQ&&MI9Z&e}~BqAL9zKiYXOJ2k6R^o`7&wiYdNiQM&3mK~x2Y3+E61 zVOoI;#U5%(7BmK=N!XHi{au}O+5?eOBue`jCkL$B$j>=BmgB?d3PoKHeo^%a+}W#& z>to(i?A~oMl}--10m46SYN*~rnyn*i{18eWIT0l6JP_+aYVT;dUyoM!Dy*s&|Bkn) z9~iE?_xGfCI*DgM7;1jUo=M54AL3*ESGW^}1PT7eMkB{UHMtFl740XRoA9ryyZ%%d z1Py!Pk~bXrOqJ;e)$3?P5Ly0HvqWSGiAyQ!@U{P~YwuSc0ChyiD1+9^OimJSTj(<` zg?#0XB)Mz)FRv#O%rRa=Vb?DPet$!T(NF(6mQj4bqa|IxK8txeEypQ=Tp-t@<|gym zAQ_?6%>P`+{#2Qb%Hqfr2$SJ>jLLOFV>!gx*F%5@hKfeCr8Z9XAV-sexQwzjrB^wz zj#mnv`u_*|AI9(kR%C(pm+56P%}O)`7!meY2m{$D^Nb2vTy-zjJW(~lpMHG#%zSik z#9~r(=TeCkW8kRdNRakwY4#u7auF$ z?p0VB-2UvDPlZJ*Rw3JwDWIYdV^!Aa)Kuw0L7g3dd@eR9T3>W-I@kY!(bZ~rEzmC^ zn@y;uk+I!{f>~tg>@EoYFb%<7 z6crG2h!u@iOUw+D<(OCx`4u7~oT444Qllupq~CQ5T1%77}x z)vo>u)@l3`UAw|bqEFqCc?Dc<9yoUe(SV-eUZ5y{_?Mj%Iiw7AWSQJq5PcWt%Z%B%T`xCOa^Yp?Ushiv*$IJ11 zc+M7D(J0$GmF&J3`xtw#0Jhe~o*1%)tbgWs6%$(iG7rk5d_uKd{SE$&#`KhJ{qrSI_%p=j zlW^qeBA;gxDW#SbTT&ulE+(YxX;=32ZQ_v_Sn!N*qGlAR%hQ);hD zL}5odZGaprtU$V}21b?-s{Q^{y~KIs78P{^HOr|U6xu4(E1b9kX=%v+`pKh$IqtH` zmw{xhkXgcZA#s#B28&&Uy;<79VtF-QHI&Neu^h?+*M%MH!q9el(2QQJ3iM%{7h+h# z^DbI1(0`J(o2^gX;JF-ykVVUBIwIco=4q$~w(!7Akk14VvSY4>Ps!H>b!(+y0(=oL z9u=ubFH>Y`P8Whrs5UeOb1KcjmAsDUd{sgd7vhf$_dn~xQSIV@liI|Ir(|zxC)fwR zhUv=S5WliqY7`T(gwu?x9-*xR7)Dm8KRuu4?!-UZtvc``{?d1 zR3Jj#L zItN-Im0}1i`)nnW`7hO9GO5BhRjBE;=uq1MLlbXqb**(#jT1wDbg@80eVT zXBfVz$5JM-VCnb*IOyb}m{a>wuA%kypi}I#`|`OAX;Q%KuUf8i;caaGGyCv zrY>tDa}*SN0sp{PZ%*cg6Xp!TA<t}uho%T38U9@CA$Cu*>alB)IWA#)J^~R^lbBpll3tUgk`qgERQkp zNRwM{#kKO2eiZozXm};UC7@#hq9!Bow!U~uFv=XD+H&pyTv4AtLo%!t5rz?0?%z(uAG}=P z4Mf2^*ph7=c0PQ~m2~2$PwI|BLim0iTDc>Qp^bnL4muUs+%B7vd_?>&@W(h+ zy(qVN$d8VKl!aT~85N-nFBgN#(?C3!#2ES3;97WEAU{PhqAA`Pz%Z6W27=#^4i6J2 zw)6K0RfxWN{W8PP{EUYily6~-e8bAnZ8)oR<5;5TF(4Iq2lULFr=wh2;uX`V}K3P~ye#~WYAzXA;mtbveif(Er6I5~_O7H^cd^wP|zSmG|od=y3;JJsy z5HxTwMt~{{2%g6u}z}Nf|5Hi3q<3v6{jkaI>If%3!UqX3Vj- z$oj^p?BpJcVG_8PM6=LAP95X&(X%Q8P8kmmRz@g}yu*8@)2}yq;Y3~9qTC=RA`tOm zq!t+rl;@?dbnRQa%aH{~qcWj4Rz?!GOUGiJk1s`o8dkAu)lyB`cU;2=+L`8{QvuDv z3SpyjWF8d2_{2~lA$UoJPuTM~q95>P%o+x^L$aL8A1F&+Ykbkvidy9C`C zynisLP-e!_tDusz`D4})58c~>$U4Q?F6W%eg_e}>X4pBRdJOJFrhyBS5F)H>4DqOV zC&c0yJ*#-^$^z=k@;pCXbh=4Jx^P+#8IpZ&yLGQYe~O?XgHc}MCapW1$HyQLX#?RP z%#nRlBOol4qxi%<1gis`cdJ88C~~AWU|MU6!=|~jb52o-Wh%Hk3SZ50*OH5IE?~&@ z&FTeYXgc;=43Zr4hivtW*uP*Ex2Bpz6tTQYDKivSLqA*23OT}=h^Zs&*=0r3QBE~}gAsb)XYn{X4*x@K=C04r$gq*A2Gf} zZ+6P6`(I76YYqV!^N>92V93R&LoO|R)2N6(6&y|YzDMo$qzG>6uL)o+Y&=>lM%$8_ zddaTaWkD+~>qKP&#B%eFFlQUOi}s_-C_Y*KO~2o8t{Q84DdVYCL@yfasiHZ1YP@>g z8G$)R`|cT>$bid+e4^vp2U7kerlpFYq3E-oTK$1_qbrXX#zhcM!eL}hE899Y;8i0= zptH^=2epMqqp9pSTJB-8x!Ex`!5vSvomO}Gc!Q^E*35+1hM2Z6e$kI@1kEo!1!+Qf*s)2xG@PZ4x5+RHE`;zZta? zNftr%kmpMeBNp@V4XeRV;%a~t=BJlf&1_zrK|^I@Ra#4Ogdg(fCEJ$aOGb-o)6-z* zH_EeU+Dsvi3*HNj;a;&pu;~-c1}P}CZtD$j5}LTtI+{H{_>ocPVgZjwt$$D;IzU&x;NlkR06>NU8IzdQaVB`y^c=n3zcyv zcaM^zPJK}~%q<)yk27dZxqmAmfdjY2-b(tZhaC*V*4O5OQjxW)?>pV_ZbP=3j!iMJ zlBf)CK39f}7EuwML062AUL@O9(}!$m;X_^Vt)z|Aw~c8_$ORNdPaW7nsNBXPxa2+N z+z!KJaU@H_oCXdym|X1_?|cmcr&pn^=!CIb67aFwJC1yVF6+k7VlNp#31Lm=#fN;P z@Fe-)2arBnR1GdohLmguYY8XQ!&4a-t4dpntPERZsK31ug+^vMX~jH7WB3c& z5oYdHK;5Qn=;9EjFh7EpP6Pr*{5 z8`8Bk$6usv(VAKLaKc@QkhFsZI=cr|IcA;lyf%K>KqjCXy>M_7^Mwd~(@TwSrf@5{ z>Vs$Ep%njxCg@7*;XjX*=iRdb|H86MA?dU}$y5{J{27&#G`ad+czajh;HTAuS%EGp zG0{=L41=BA-sBbl&`dtm!~cw;VZZ$*znOStRG%zKGIK^8ux zvrz_rMAT)%N;yA2IJL~I5_5(!^3+f$9lu8Lj^g~N)%2nYU5qX{j!d)7RzO^lf_uR? zTd(ruJR8sOg1e}259RWh5;Wu115TocF0eiS^t-@9#7@$(1^&uLzjgle5@2Hv715XG zS|NLkvD=o@1v|S3w<*`BlG~r8`IHHQRJ}=l6No(=jjQ=`btR(v^+0Qr^d{D;3Gnm4 z0qK+ukow1yfEZ|E`zAYPnlL1iebeK(2F~f6vMR(8Wj7=m$w4%XVcnC|`uF2(ghfn~ zOr*SkLFhrHd>u**gA?4y^L=onZr5bKL7QhV|> z4S8*J#L$NU!TITE?}VA4@%=UKu;ad&MzIiBA7CuKvWB6P^!s61x=ocv;G(N*Wjd^a zrQAWTzdh^!Q>#O&)(1*ZyyQjieO#!)6tow3iWYt_D6_>A&8^r;+T^E*4WOE0!KedR zET6*3r6j2PNjpit8t2pZ+h2c07W%Kh+LnLQKALaQxyo-Nf;ctgAKFpGdgKf8JTH4@vBYeh zFY=F>csz{?JfqO{?Wnp=o;}?D5~&ZodgI;x7T|;&vgfo-UXwoTlz7Et4^1TVv;WM6Y{3Xr?8tB)GGH^ z5IpfIC0}4)PtJu$XAF5Ds(F}fu3l#<(e8RqwcbHI!l8c{`3TMC=@>oakf)K1na9{o znI&29bMoN-#}a}3fn~gy<6fQnL|z0ChghR;v`Vy7t?n@PrPg0fU`KltYGs!+ViwVC zb>?;ge}Kq}ON>pj4J~;{aqmzq!(B( zEb%z^Fv_J(90*0RQCs-c>*iG>MU6h+U%i4mKHoR`mF`DR__4c3*f0d%%Vu z=~6O|JQTU6C!Jdlzr24BtCKQxWLI1~_yrtTDe0%FkAWkc(rO zbeNXou_1>1L_viG9Ed=b)r=}BL(2uyNV-Ub#yoh6X=jEjFUe^NoX>!A(;$MaCiWPF zX6WMhY6t~^m!W^`{KcHy0QS`@iU)i4{QDoCKYjA{`7>OP-N7T2obg`C1c6;A_&f%TUws{NoISXNNnU_Lp3i{{{{+;W3YG5FJR9eD{k%#s_tFpO zvJ)zXF}=xugT?+qN`+T5xZKCz7bUsBOMNZ26-K9uP9I8xi*&IpMLiA21w+YjC?nx+ z23pWuC3RtB%unsTl&`J2)KKe!Wf=)!7G(}=q7DRdlHCO`f6ociwM5IGYkXbu9qx*B zl_4BhwY8Bz`_IBlbZ4`|G1oi<%J9|WmW7+~ZXjj_sWft?Rp3-@BicC5u46k_96w4Xg^0DEr)5kn>atq2da9hDHg_$sbp#{CA}Lp!W2V>IG%RI8C0u`5sk57{$vsLkhT{`$$|0m*$lz|FPR`D^&NHeEx03cZGz%pglftLDLg`cL1YSjMpgeTN zjs}@t9{ch2LH#0D9WAqGBw;)q=NQM`KH(7NJ{CM&@j305HzaAW z(xdsy{aVAE8gMxkwG-X^tdHPSXekng6Ae_OQ}e{DTH5;(QL^yGQD6gGn&kn8DLC( zYSVVTw$c@@tEy}UFY?ji9R5Aeh%w#Sn<>Yc9+$-!_U<04wRZMUoi*$~hX2hz%1ZP_ z;YHhmW+}eVLT9@bm0bS8!EFSh^T^AkgfNCdOeYzJ!LaN?vs0X&!p!}IJ>UK__1mug zOG?ATAVFx!D-zuzQ_4-tIb9{899Kye6CmRp+v%G`VNvR#r}N@s54%-@K-tiTR8;KB z@Y6akC6jMUaR3NEjU2{_*;3KYVlmJ2(FpZ9w?Z?GAV9$(!tRCx+-Q`!g-&YgzPtZ`)u`-|I(d9ST&C zwgFEmM`h>5ylKU08p8b%Q5d7BydsUX*uSciV)s@T8ujb4!uT`30GOEFuMntzTS3#{ z1$E!)Cs-Dz&4Gh*3qTWgpAA_i2?B5VU9ot{S)*9Ke>wdI=pZi#)k9>FD|%bZ#B0Ik z9W{#r(E>*RRTqeU#~1UlWW)QlM9dI4si-^043V4$3*!KZt1Jk@$>0)KRafB{BlQCH zbj61>6+Ol5r1a*P=TgSf-u*Y4#QH3%M&tA9PIwKIHmqVh!Imy;`stZ@YuOpX+l07l zV5@+mMND;;p|LaOEFDPAS zu3A#XGJ266CwF&tcaterIL_G*BgjzS0Fm9jckli^5NK-)rjhFx^8)rHi*!VbT_3SJ zBtq2}&*uLaDr!rA*p8yk|!BH^xrX2;D1RHCehh zUB=CId(1JIm0j$+Tgi6iq(koFZv~vf&3*NK0*dyyNSRvwbVDc9d8kohGiO7uz6o&Iy9%Sz4Y`>BA@e|KCw}`z!*p5@d;I=_2)cfO?XK za`s_?PM$9neH~ei*XXE-E}p-uuZDw{oh?FD6$mTQPf&=_dCt%yJ9r;TZfSpvu z(PPhpZ!Sf*B2<+Wv>w{TtTmZs`;`oTal+pJ{U#*q&0(7hiifgFKqLBJa!s5j@J~+_ zn`xd=>66UaM^a4vRH`<#50#TnFP)RWZuuSAl|tsEx6WKgGa35ELF5>w#(?62b44I8 zd!g5wT#)O~kk%mVMIi%-<_!HOpd1AHj2$3w*9-cU^wdHH`1z3cgzqoiS7KRw`HaYd zn^3ZmmI6$pac*oRXOvA#O@IpC5iL@A4txA$xljywf~KCO$bF$DS0{)G^t2FMEtuSq z?>BbzF!B57NV;EriW#-T13Af0=-{#k41yn#uu4XHN>%1!{8>#fzZ8@)bljj7A#XUU zOQxO_GANTH91)g4%Qa?&qf^t_WYp|U8qQ%pBJiEgCLTFTyQ7Z>_-&Wsn8GO#kd#W+ z--hGHCp6c0D|TH<9+raGAgfBr3RLK4J83zvC+#>IhYl*PPYM8yplAE4GeBI1)@+#&eMoZ97!kq6Cc(>JD@}Xpdhpq zIewFDk?Q)+FfX~^?q)5r03Gy|EWIZWL$6R?RHjq;sd@5m#>I4;6;el3!@f# zLWh`Pj%ay3gBwV3JzacwR|O5>jJ+Qg4a4_$0EaBOmzt`sx)=QP#mQV7DjDzv=W61K zwW|rYWGF6FLiPlH%RtKn_BY~mk&0WV%OVEsusz6kL~c?(M0CfToO3#DR7eCK0%58V zfF>`=)^VIIE>N`>RY2Dn+*$L!Pyox6J<$Ch=9mAr@eMo{Q{|~34N3-iHzRR5Phu>W zYLyzE}8^n2K?Psn4xMl z8scf_x(aHGb+}G&Ou5Wrs77@CaZgrHy6*aLgeo8JMWCUSo99yl^T@~+br#aL-XG)= z^IkIUIbQKvehU5OJn3svI^US(Y346t&Xib;_>mBbm#1PQ$OHVGvM!j002b3?L?vfV z_+VO49kb;et|EpKWo&1X#aG>H^=p6XHnTs)xG)Evy1^)_q|v2^u`k_jRL60`k45)z z_UaALos!3tP9Y7IRs@JzY2s->aF);x>8~LQd3873 z*z;+n_Z02GH&PM~X%rB_W$-pcOyO|U2zGyz0IflSjLxMrWOR@lV~7;@%b+IYrTK@3 zc2^xp3sG9%`{wRf@L}!7-M+tbX!8gi)>JdpUSYNfs z;QL?Bi;G`$2~r83?g{pyRzWujvv63BVO!Nr9-a(P8}a3%hgzQetf_kxn>Wj*#L|W2 zUIB{;r4{a~pLk8*qgfc!Sw~1?bq`oz4oA+aXTm-u8`SD7z=<>H`8X$WJ*!+mhxw6Z zx@+0``Z=T(M60Z_@Fy&lV^XDbN_mWh^eDPJm20>-oY-1C_~%IM$?+tSXiUp1DqX4n2}EblV}+ zI^V#Ddq`0#;LylUapv5cU5Nh^mq3}{kejeW%E#G;03^^m)%LgsMM zVMrGLBMZqUA%n0)1X3}~r?OAZGS(0Ri#p2BP$?q0wD3?7Tz4{O#Vmi>+Q`(8xXn+{ zfk+^|_14+qJfw3hH=$fKmZ^68-Lvg8cH@+uzKx)`gO(B#sbQcr_JNFRoWY2lZcmfT zV%ZYS5?YoO)=*gpODFrYeiL*K(ju z)Bvh?8qPZRV^2CdYUrg`&c=ao>lL}7*17TOH%S1$p2LsQAiju`bTX-fo$<@RavXt5 zal60#D~D69991lunvNLQir-C8Orripb}j|N;HYHzIpG}3J1h1a-7`cyOQ%Xi(N>jj zs+rCOkRHn-$AnIJKu}xm>A*W&JiOeNTWxD3t;$yfB}y0Qs$062q>W&!poLO)ma0BQxW+VO#2OhihG<=U zdO*x`Ml>_d4#T5zb-R_M!1K zX5AdYaaF_)AFNL$2TdXS#zIpOU||RNx23dUPKo$oN$=fB+Ss{%)RSwZEx|W@(6vdB ziNZ0}>5j@;J~5B~=h{hfw8bQ^mOE$)cphb1v>#$L(D}zDYw&PWyk}e1n=>pyg@`*H~p4Ke^O| zA)8jyyoD=xTM%|xJV7b?l!6n&>hxG0l_4eI6drv;LhZRK~Q#@y4iKL`-{R zL(!chF7EfumQ7n3?eNnGYO zY*1Qm&Ox~m-qK}?uQ|-L_8zwiz9z-*(9}?5t`p@5=ZfY`OKfTl5i}fI5p-o-!4}oO zg<=80V&Pv02|txK*r7lIi)A|)%S%KIEm8JLzS^)H4RMg0X&ORg-vv2S2iAxa4Ck)f zA)<1l`5Xr}wiWBFWDP2Lo4wka`^mYcDBPzcq;aRYAW;sOarnM0eWI@#haRQ-;%iB6 zHC5PYiI$?KkTAGBhU>JcP+0Bq%DFqv?K5ur!t}L9b#dp zDp2i>%!{j#!5YZQSiL(O+ZSaGqd3V=brBil;bm55z$r4>^Y}PxR5qM8#|LYoG|4jn z{9F6uh?9rV|A3C?M8QQj&Ghp5MtK&=5Pce4QashqGPu^pE*(odH z;r|obR*I=$-XlWGh9g@MrqCu=7|heE#3o~X;6twKZ7(PX-)B(`6}5DzP4JUVt_uuB zSV8OEp;>uIrp(qXmD=lg75p0Pwfy3R(a@i96^fQSUs%cl?zBsZO_;6xR8oS_<8zqv z(oGeW_%l9iXksc^=U3g|Swr8LTDcUXl&kEcjEcZI>F21Yi8>{Bj{tNs6k3T%q^H?f zcQB3yk5WE0RAB?>s||FoGCho@Pc)N;KR_29%?a(3G|P_WEG4zR;Ju)UU!p9b3uF!#j=uTBa>*v<6BM`M*_X6 zr}DuZt$AM4m_*&xZLp@imoO>}YLkdvqf?ES2|6*8zvkT<|F$wCjBpJ2e$U-H zOy@Qzw=>k~4yIJYR90HqoV7z* zYKql3J=KhGv+mZ+EK0B=oV4n;>~>>QVrI+*kn z7;?OQcW3AE_Rg2voZ`GsS;e<;i0Jz62bhyO(p}2AS7rctKM21EC9*l?A$`Ru{OH$^ z{@Gh|rTfX#>7iZYVcZ=B<{2diUd~-ie$63~F&C!Bc_{;RZ@R1LuCR}_O1q}r+EB^= zxZyT%Bhk_JfDcOCLdRg;hOkVgF8aJ=cexXgxzJpUb+JtZ&JKwRsCI>A$eHw0TM^t; z14=hfZNTcLd7R98%%(5NBYZcYZinUe=&c*9NF+lJD-%tV=yZP`ZntUX15znB>=@RO zhkj>VMs2Vs)r@uG>b@E#k;8yNg$;_1Z`zAI_W{nIsc9Y;adrfz%bf3FC z;bi2K8S@M_8#FuYbV}_AOF;?43>|+@neR_6n{;M4JWgdTL$=(0tW+OSuX@RGQH<#q z2wkL?M$i4jcZ+xPchjS7%#k^lO5yptIX@wI0*R8_{<(87q-cUGjySkNEKS(9>DBRa zu_&fj%)NBK*v`2T5P|%+=@k~%*T<5UTV4uW#+AZbT_HP3&C@Rog}F-0%jwA#%ANCK zTwc-OuM|M%ii3u)FxBRj>Nl^789YKCDYO|~39=ouasn?#+LdLQJrkg>6}^#?6_CQP zH`LHvDPW(xlpu^sahlB)YzpeP{26DJu{Q;*Q=;lasHEpVZB`~$6^Kt7+WtctMAiv% zmz+PWHHQ}8e|nHu$sZWx_YG}Jqp^Y?>wl4dG)+C4e^^0t{cNzG**2-M#E@5#yB9fl z&oLwB$ecI}h3=q$&Y&kGE>Qbb%S+{4cOsXrs#?vj2oRvB zNF9bNK(z@R0}CKXH1ppeo%Hb8Z@TpQAbz27en#+j7vZIRx(57Ei=clew zbe0pJ=vSxur44 zg?1de((?oz{<^hwCDvstb((2(GCo=>FnGMX6g zI!*}TsL}uAp{r3xMq3Dh75@j1qnnLCb|RY(i(ZP zj{hyEaof^V-ht)3L$O0ChC9l8t?1eV`}KbP#O~8)HmurbGQt}kW!@hL4M!RTUkOFO z{#Y*vu%`J~_ZWxnuj$weY(Xs1Bgp5v{03O%@Wwu+^C@g}`(Jb}^Ht~44JSI6d@S?o zu?!>Z`oUK3&TILniY};{f|)Rsuw$5MHvf>1C^0=rHxi_?;i%_#>M-MprKRhR2dwXW z9wZooJhtje-7hzxBhhKG?H1}fB*Nm4jT#okAJo2*?6lR$2u<}G`YoI1K!6X2Az`*G zr6Z(!VLA?_{6W%Ia@5An@2E2+MXG&m+WNP=EEng+ICCq)>}PP)wWY12R>*Y}Z}Zqx zR=Wzqw2`-m>mTA`WimOjK+ik4{mU;__?KVW^=rnD&l!0Kw~sXdm*thdF;%=o;3rLNFr)lc>t>#xC?eyIKYc| znA~7h_&5m(j^!5J(NR7rlHQAXm5Wj!MY<-e5Z@FPPAcZ3u-%9mh*$yJlH^%dzpS}E zEl|0Z!>#NtjnV~=9r#_M=YL`-0fEG8k*`=i0f&|wJHm`Ohy z-UeT_!b0PuFB6AOI_pQy=2UsV*5Ol{;}&49+h^ILjZPExq{9J-tTu+X=1Zr5!`;RZ z(=fqvffP~_!1Ynr0%IJOgYRk%xO5lSfe|S2>YWtj0{OrRLf!G{BK3f^9rguRjehuD z=forRc%1?-D~3%h$K!1p5~W!o=N_xrB0=T+=>Wa=U=VU`HzbWoQO${M?WG>r3*2oV z^g4|%VEoQQ%}_lR7vsj59s9y{Hkh==c2j$KBBzWzr?`Y2lO()jg!|AnL#~FH&nnC? zZ5kkkK%LB|if5dn8G`4O`Y}e4xS=VfZk0=tSweN^!fM;mhg*$bR>L4a5XTue=t9VF zMMB=TS~fLVSf$_5?%{`9fj{=v`;{l3)^^Rwx3yn=^7$%8FEF*3yR-s$li4-KDLfRO z%9di2dxv-#n6k&w4Z3Z_(1a9&w+u~Ej8k5x8q{$`9EX1^H&$ew4mw{QI7hoMT0Q?p zJ@N`Cf5mDMkLZD&{?IEJ&^HKz47+B2ncN?Ii73$eDW_H8qrv$>9zMQz*Enb1Bo(*o zK{ycR9FGP0b|08$y#zN)pN2x|VZdQNC_Mq)!8aJGbOWKLjgom+PwJlK`2a*RnMHQNHvq|#LLun>htWqON`)QrQj zyquwB?lLz}Xb@x2%LB=sqE*#m0eudJ1IodGy|V9hi7JsC`d&jhm~Mw2cdRB3xmthHq$Uj3 zqhZ-tD{eZ;j3MP|CGoM-zxYcbC|E)Ruh10N=NvYrE~vKSyIYF)q4$Rm0p+b~Tar+h zvsadNn$fG=UPd}ff9I)ZWW>Oj@&oJX4iFb3rqY1tZg?47Hq)<7 zqxLD%yKR2(d1=G6*GU<)*xz-ksiwJV1xK~2b(lFAthV<=cD+~yRnALxK~0zW#=^Z zX9S{29vQA<3Xg5^$gPdY>!9Y}zd~)%=(L3`Hcqm2k!KeJwH%x4=tf@t?bWx>ijye7 zYMWCpS4J^LCJE&MF7c;%dJLx<4W}vG{tE5OTMAl>sInCA3k)C6!D+$Fb^2l{#xv@0t2jQo*()|e01Q~FI zqkO#8lZb1BKnxiJ;*-<4wR`vR{RfIp?65f>Zw0w;)wx>>aw~HAx^SEgC&gh5y=1YA z$dnA2W2_LNPt*GmjQup68aFjTB%+Rlt_`(gdyWD(ds@_QE{zAFgu63SVFw)*_Bv8U zo2_n@PC96B!nbQ;r8b=6+67Ru$~uqiJle$@I8P`C`;GVkxyh%5mB{6QL_ukz>7qcS zheu!Tbi?h~Oj^7a_)WIpWIyE$1A3=t!KK2I@-Y%vwG&pwlW|#y@45KkN&2B}`BT&L zu`+dr4a{?3kGoW}!OhB*R&^nQd3XLtD@L*rh5x&N)3)@1V%GxVnet}*nJo&sh*$tl zl?Yv5+Lnxj#K#XGKUT<&aXRJforQ$E&@`aQqN8BY6mi*eD(`g6D;amf-6ipT8Azb? zgLZ2;L~_Qf(|f?PG7Q7&Hu6GF?B@K4zu%CpjNqmkl7;D6WT8?Li}{##5eGyYDH+wO zn^^I**&;%T9XSOid)~QBV%!)>VWoROfWZ&@kF8P$&E}VwhD7||5D*MOgQy)sn_Nic zTy(T#6(ycZ6E`Yq0xt?QTy2_VE#~u0D;971nhwRxwspDVQ*~j5_Qn9^7x3AXzbVG@6n@!LAR&`<1`pxKt8_-s zD2IA5^DJnP&nExZ9!XM(p z8(3#Tc>KuJNBWKQkmkm**4MijR@rPU8nM|oX^(7iKDklOdgc@J(M)M!8|k+-(Zk9aG1~ezt}dN4gtW3X)}4u$3nE?&H>I z*fSBj5KOfY6NF8pv(L9R;{|0FUmVDyDE@)lDhe`4Nheyup2w6VZnLLi(F;OhfPI&q zz<$IVi4)RbGr<#ytBc$-8gX!}_6_t&UZnYWZ5;=^RlMgs1C+;{9j^uTXmh^`ZNU2K z)AV?rpKzGvG{X7Sq!)RU%;l+otBr5yBcj(@RVC;3|$@x69*lD;(IqTa=aW*B`@OV#bG#_2BE3se`S~|psr(c6`*N7vB zUThUh9rfRz88rH==B=X>P|@>nL*b4UpThbIS}Gb7^jaG?&Svs z5s=jD%#hzv5%i9EL^W{9O@iWjW+75<8PKAaSZOy`rB>4P<7uf}zn>{`R$W2wMMZ{H&}8a z*^N%Q9?+L((_)@EIm|8ou_RB_6(M;soJjvvk34o16$aTNGO^;{YGI9|-PpK#qk|SX zkFFk@<7l20Mq4nZpky z`5s1Ea8qpzj&_cJ(HK`+3~OmsR+a31o`N=-zp53zZg*?rB!z&Hb*e^k=jzf8fmg(v z3iX$WV@%;928|N}E2jKyL293rqv>FhW4^EAbV1M#*|fhbx5xSMJe^-cfd}^7RSi{*GkHYmb7S`sR*&E=0jd`p(7yN@4lqZM-( zt(a@(_68GK)948mSvx;YU)4A{_dO32_GsgFDMJF@8iC_?D;b1H6r&zRUWW`BPg%bs z8Y7>4S1dBL`X}%#J^F{N9fm%&| z^xMXEa)TpOg(lRC_O9DwND?GTf>4FvJLdpRK(fF5#ifXur0LJtSt?kc1C%6f8Ps?o zgM-=mgmqV!ys}4m=Wjjua%VSOEK+;uNVr{Uud02BE)wIK1W)#p9a$4R=;p{^X3#JJ z{}!m1YhEBNRb8AH`A2&PccE6&)`osSqavrWBwg2W@saKEi)_Bls8r1jQt8*z#;b;n zoeqX;hVv&-inm@sVrjF|{2M{Thzv+x+|peF<%1K)#4 zv+Q1xC1BgIZeA7h*|`>{Cz#{~QE2GD#d2{xUd|;6E*>Mgp=Odc_vg;x&x4~oT}+=l z=nS^HS5VU9B=f|*oi8(9)e8J+wcrcn^P`gDkb$T5PAj>Cuwj@EMZYU01N$^Rqr@B^ zNNnr(Nn-(&XkqYU3`$4<%%_OaiiVovmPrxQqE2r+pLg;8}!l?;xOpo|Qe-#l9;uPSGaxEqZ6eX4_U9Hs>Yi zAVp9A?--94EMDwp|^_FNq8S zE-z4MvL%>h!6oI>Q5rd2RUiquGULkRwsRkFSK=C1l}h&g`HK{~d3gdyUSdcv1%?cs z5bONWMo@&avuqBu3F_4E*`<0aALS)+EEXP;QsyFB)8%wrq@(zD6?-7Jvcks`HHn)Z z8ae6=6u{3i3gR(aTU2tC!%1J9oDVR64_r`gq6SQgESxo1lq=TWJ&`sLFqbF+ZBoy7 zhb@d4yAD7%6--ph;?C?P2tSyQ1^wq>FZ04zmXLZT>*)8YEU@KrkX;kt08m}W7y*1g_>tDN4tg`b4I&Q9v>zl;!$!$TNI;EO$%TQmj1X4 z=`2^&M>BvBD1`OFAkVGR1FeJdp`F1Np;;W-W84#OS!@vS1?$|867eOSIA%E0DeA(< zmlE{#PmSJg38Wh#-86|j(WFN=Q;q#)TE;G%3%$rUbjJ+i3tqDA5Vt{pOB+KY?er9H z3426$hJ`KD#13tW`8k<-pE8pf-Z=v=- zjOMrGj}H9z=-XBg@*Y+@QZkyLI;i zww!3vWXVt;Pqcz(Ff+j)g`7y$@m76btM3))HDYe1OB&PX-4`+m+O;{X)*oJVSZ>{_ zw@{13+lXTAbv`kVpH}alMKc_ZZ5-rg&j(Gcn>+6D`~B!l?p3=dS9H7tx5Jh}u$*3^ z`;z$Q(|IushoB;VxXp~W2?9+u@9wRw9wt|fMjKY9QWeKM*2?M#{*q-g5DzhM4Hyf~ zWN2HT8HPD~1tM$QV~2d^*=CD;lK*CI+7T`0&Fao; zZW%U+=DHLh{AU?SM8*#m1gcJ&U>*Qv5J;!tbTC7Iy?AKk7WnYlETcQCbW-B4UgR?% zWF-BxJ|sDc5E%)L70EE>Dy|g{CHl@sbB;A@20w{)S{=|Rv( z2)J~)$E!R^F|~D4O!5T>H~#+(fA`}Q8JoaLfcRZ7JV~JTB*Xy^{~-slq-%_wBiy`X z4j5cR>N!+ms&xmLJb&PLYgaNH@FXM))Xp_*?pj{ADCLgOh|goT{&jre+WX%vDQy8+ zEOfldE|MRzv*#aYuvnd+uim{Ibk&h8;%wkW=U_Ov1OHxi+mxxNgTKG%wjF;X?tipp zgTgC1?Km^xs_;A3w(PHA%SNoFesc&lL^wm8i15H@!KSAIk(R~(u zD_5ZV4(Af*e=-wJF%%A`z8imIi;S#~>13jYRu*aBxkC=U4Mn@v%h_FuKyr5jKjIWj zl^T>4X}&}`ONQgeNrj7J)1&5CMh7p(K0{5=wBTIe zb{NQINNVk*ABubg@=SqFB6v)RSQ82~nj=n@oO@ZKs>HVfugGSBvulJXY;Vk@S=ro` z;540_MV8J-#l_UK!TK!DjpKRXit?zD502bwg`W(RuAveoYAl6i1XCT;5N8-@`4wWX zEY5#SY3goMw)t@Z0{C3L3}Yikl*r7ev~*q@k9%kYCS;po!=R*ji}Jd$xeOyj%WC&D z*%~1dk`pB5rwisMZr<@{4f$=_+-GMLCVWv=dPUq4mQz87zs1P5KkL?XkPad|zQZm?uCPnUHyCO&KkgZzZQz^P`CM`mm0&Wh5L;LIRvN zzvX4RD1Mqk(CUvLt>);+%CwC(CL}Afb224}9csH+F7`Cd4omK6)&a>~tooB=PF`Nq z;zIl6tXgtu2=B2%fx3#>w1|8|B&2!uNQ5Xg=-h+Y#Z~SFx5;^S1}7t=sF$2#!aebh zWLJ)8`Ki&cl%9uiOoLB?<{t|u$fSgKyVhv~8MYY)9HY#F5Uksv$;_g&$5OQ>?Rp)O zcX6)2sUM>`zNl@C{;lV9XT3ESA_X+EOujwU0w_KLSLf69Vh|3?`!on% zh?Mvue(~N<=V!qYH+oiAxj#jRSV=4lG=RMK>28>!=S>E3&M5S+Ct=d!a--Y?)U80h zahg{L9&soml-Qp-ToKdwP|V}O6c<%38HS9_(+kW@S%QGW8T9b(YJI){!E+bgE3n^; zpO8IPe`F>XQ?@nn5_O9B%rxLURy4GvXY8ar!CwPfM#b4gN-(5K;#&}H&Y1U;u z&&!{vEmIdLuuZsvVM!VVGcSXQCwYy^yIQt1o0YO_0WsbCPbo{RIC1cv{!=R&eAbm2 z5G9smJ=id@537i{Y|`|irjX}Z80)iQ;a4N+WP`Iok6jkjIG&JE1Qkkfw>*3ODsaNo z6l|kT-9O&n>fM#yMtMr(QF0(&B4Y7?d6Dp$bh%q&Okd=l{V%4DK;iyu308~Ok#q#r zUwa}bD!4tASbrb3`I|+7!e%Gz5yv*|CpjgzVQZ&bb~awtMEI&p-)IX1E zEru>)KB3v-nf8;lcD^IkzoU*dh(bISqAiuUz)qaUD_T6yX}m;K?c-u}soK_T6#00j zjK+*CX&y0ob;_f=NP6(S*5~#RD>95m{i3Zn;ZUD>(jA|$`b?PiVY3skG|9=T5%xqy zoRkoln-``+AeAY@NF3e^Ko1g>$%~O5Ke@ok!cJBr^sAoQf6_7>(m|+`pe@l3HBCIY zaaS<-$*1r*J4vw&yJViG`B-2nk?vYuCOgDySB6AR?4x{JA)DorfomnlI1=P$;C^|y z8{r*={msFa;ly2gt3;TZeZ8g8UugQ`^=lzl;36hgPUrt4X z1**73S}@oMob-7oJn!RVBnTx=V1ql1bI_^U7y||FKYG}^wR`u$?xSv~0naN8 z7Fe0l@+3#jfcM4UzK6;m$+qSj@a6NzY-f1{0^ul&bYd%q>6qP{FAcnIQjoF8 zTaP-`)Kn3=`_#!RO)lmVClv`$WC+5g_Fga|Rylzw8t!TSu@gx-$dTneL7)lNACfiE zG8Q@i{fA_?6}(=c7N%(^QHv>x2ImYExehj5j*_q7y4#U7=;4$gre(OfF+u}iEK3(BMf|O^>rb_Ixup2@;9 zrli_TST!y}Dhfv9j2!Ea5j=oGcuUN|*sADseSJ=PaE~M4cHLl~B|$hJlFCMi*1*)M zwFZNYFi2cKET_(jOnwx5I1!g*a=S>U3&wvhW|8c2oJ}(nUzTMfhba3tSRtsVmLcXw ztfKKFl0V!QR4N~^cuNwdb|Cb?TSD{$XA!CQYdWpB zB-vEFf*?|Qpgynm^cr)F-oSoyc>@#t-t#3yD-f!~2TI8~CJvUTnQAoHo`iaIRrzja zC+AR+=;gGbyq@18Fd`RU=CNBk6I|yC%|PBxudmspqLdiysJ$Y3<8w+;F#*s+@1W+p3ON&E_^v6&<8f zQGxB5j7!KN{DCKl#{S56Y2zUkA@KMzI^z2cejV} z*AE}SKfAm49^IvXzkGP#$pX>PLyjSQY?b1O$%){aiJi|eM0o?E1*l{Y zSYbJLX$0JiA)-=#A_5xg%`rZ0QBVgRbP-SFJta?Y0+L4CwWR9w^hXACh{pyQ+!eHH zqgu|>ap#?B*i9id9-T+Yk4M%7RU(jCWLPQBIP&46o}ddK(nm*7hjUE`bggkP_3p25 zB&*WLsJ0rcd_+RH#@}gc4q5FH$d&GvPmM$t$!=bIdSB#vD$V& zsd>yqqmyE0Q3PHR5_bc|p(dP}nFk&d35e5SV=dkq8_vHu!{yU-{M;L(=nafhz+xz) zf&A(0@}_mtlIrc%R2+j%v_je;E-KF(B+-6L70_#{LSeHtwy&``y!3@bybR5vHBP~= zrG7+zAan-^_?=1-v=xU!!G4Cii<%)Wo<(u(BSCU@+29(N2R|c0;=_U=YpiS`dUqs_ za8|uO_nXH7r+@WWZ|aY#{j!i01WUU6z{QqbZ}^Iu9+dNw=c3Yx4CM_yd3rv_jd}Op zR!?Hq54eN~9|Es{s*PjZ_C#6F({`zt@e9mGrA>Twh_c^Iyakj&<`^ zNDRz2Y$*#doMemiFWKe(KJ%>Va1!nj;85;8e8l(kUAphNdHE2!v$+{P@ql`|^G@?I z21p%L9vCZF*=Fi0;e2ghPEW>53@jw75DaDT;5?mkD9~RtMi%MFD?5b@YYJqtosJjS zWmc(S@D}iIV zZmVrSX?KOpD#R)cP7gSPtZG+J&M}uG{O2j|99%K@Kl~k6htv#bvVpzUIW>MxE-QAi zM$RYfgVsj08M#OmT{e1W)eo$bn-(Ene>V)zWE{@sQNKBO*#o7F=SG-c{)d=N`0#J? z?|+iAO%HQ%dJ01G-{jx_qyW9Y(SQFlDNlfNpZ-n${ZA06<*Pq7#T$G-p?O0jq-Vtm z+A>Z!%Ege#Y$o^#zxADVMciXEXo0|Yvcz4;quKsXJhh7S$(~v?A@Cyokmj_(D+|oi zpbHFabyzW(%+037hXGZ|&q{M7b4{c01r!?SOB)hR3>t)7A^cky-Ke+qPHrJH1uY<8 zCwvGCS&YZug2aU#p=#j`{#$v49zFf|TduP4+xV4+^t-Pw=B?n8eoyiddNRU2iGPu2m{h>9J96T3#&8S}M?LgZWKeeYSFFwh zw~cemH8g91VtUxo!vBu8YD$IY9^HjU_u@zQ;n7{pbw?_+?hWXn=w+A~Vtnz?{L<9E z6l^5<1a{^COGVKrri3tG5GsS!s1wJKMCz76{>bcWL&!xah(`}~!4;c^dXS7M7>())_hT*6gQZcQAZTSeB4flZ~$iDx&XL;bKx>cxFnqO77rDvLl+0RxdZ~ z+CVXyq5ztU+ye|6?PJ^Y5eTsVSZ1gh!uW8;I={iVNy^5JrZjSZ7S#`#9v2-Nw-JWs zjC|pJ&>hytx!UYkWg6x2OY&i1%s{mVt~LcGVhikr3eY^_;_2thsdpDE>*95!*5k0& zwz!D4b%AigWqockv-{W2ESWgtJ%f*~-7+hCi^1mHUF>fLv@By>0O_~audXyL(hMRW z%f@T&1jEXb9iWWzHJM_Oj$OH+|DG2YNeVN)2y+r?u2(3zxlAl4`R4bdTB?UgX;wZV zUd4|uxXhc;iCJ=K8|fLW=p|*dqf{_JtS#&hO-)iMrNulw%?J*wm}Uc!bkGzVixe1W zO*&bs={99__sVudV1tdxm1r9y6E=j5s>8!Vd-VG@7dv7FSN5hlw0|q!ccL0ya58rswKO;A zf~Gu6_G=E=p?B;J_&g#8urY5vdT<~0=3nkSxZl%li8p!_xk`)^|wTq#9p4 zYJnqUJ)`P9l&h(yq_0aCdSE5VWHujPVmL^_PRj7~Pfv}TQvdA;H+^ktySQlZrD49P zIxC6<>0@pLA2xCs@Nh8Y{G^wtBJB58a42Sb&ccBM1No-Yd>hW{Z4{O-ia9V!0w2J5 zIAR1cSQlE-bCLq!pMeX^q`RrA;Dj=J`c71$`k5NJ zp7TyH9#DME%`X+r`D8GrcVZSGYCsJxChgNAyHzuJ(e+(1F7$V+2*jBir-K z!A4U@3M&&FmhXGmFD`S9#@faSpEOv%zSM40Zp8P6u)wwbVw!bSJC&q%Lj9fk?Q?_z4?5wN!6=|17?KDfI*%C2pztcs zUcb7h`!X#9EFo?(oT%qdUp;w4sd|~PmIpLh^<{pzz8Hovh6n`>N*UY;g#PdE$|wk5Lj`9fJA zQ;B7)dR1Pa^0D5s4IDtLDvR)g*FFt`Slj|VsDe|)-S8Pwq6{Dve%4s~Pm;kUW)lD4 zNvk~s;@1nt` z3Nde@evjD+=?`ke-k`Mj$zy5bMD{3$OawX``$J(NLy?W8Q23H0Wr>WC2Q9TMuQK*p zo1Q&9iU`~}pBX<*iqRvb%GF_X4Yr}_ki2_saE$2?pb1uk1s$NahsnM5H#wS^T2!6U5v?Kx9V;Q7r7fM0dgakZQSH@^`6bc(5^^5LUO4Bsaj#aEut8{|+iBH*6)6kek z`P=lj%Ra_srP_pUFotwQpWPGSwa}N9I)bdQff|enScX4jE;ybBsMz{MYR17Y(h5io zaKn|QK4|w=K~s_o7D+zrZ6&}8Y4X=s-}ZG|oy;-&I7xCCocCzwOZFS0i%5dKMd>d3 zHyX_T%BU36s(N;>Qie6w5`m5)7}Z%x#3U<4uiOa{-*J45=>q(I@(b56ozW-F)8}cH zodzlS%W>tBA?=i^@@~+(26P(voIn#QnE)(ogUt%G$1OT~EV={J1zxZCGtDba=mm1d zy8Dzf2AVcE#aWOkM5aSI%+62a%;>~!Uhuo*6IwHS9nyeZjd||9A>PbFKqx>jRz;Uu*JMl zmLS%tW8YAmmrqkg6DD5pRBdF^SMCHhHK-h@CL5Nx;ktK{Q+*Awl#Njt%i8~RbQ^G^Qg;DA7I zJ$9ePHf}{Es?WK5s8fz|7;T>5+bb))singlm+hT^ttDWrD!q_z4>0&zfmwJ@J=J!Or9n8qyOW3>~?AXZ~%>?U) zo^XDM6nWt@bg4{d3r2klqE3%=V;)4u-rDd9*EIHH8W74`8xfUct6>&meiRf~4<8i-2kBd1k*(q`CJuy! zE3a10#2*`z+tesk~~H%6%R}Xy=r(K%)8!1R;S~wEi=?;q1Q-@vPZei}pHJ7exSr7(*+-e9Z7Cj3C zQk?*#vSyxZ<&i0Jy0k=pAqNpXsN}~9o-1xn`EFc)-8<&lPC`Ao6II?7LkBF*jYwnc zLJ%GD6{K`Gu{KUm*S2A`2c%2}5*K~6ojbzXVI1sP&9u(XT|Azn3%aEebrq_>ID{*m zZ3LCN_QFg{N2-_&yvJy3HAST#G{uQ;5qkDkV;K9e;e(1P!(uV3&mB@zlo~vo%s+4= zNl4sbShpjgvDe-Oc=)Q9L39nQy#cDZ0lce4Gcnek)-Vk0|LOE-)$OqITKH@d*>rY4 zgHv~>xB1+*$c)x-s%~~(*|jc|m4mvRuBf%SK3!O=FjUnt+n=wkvi^UZy0{+Ss2yv8 zwt`2Cpxs+3?{|rG$u0#AiscLKz|BOcgmAnquF+4EhyKP=@su?n4D-1eg}ij1x2w#Z zGSs61)X^;<0@ooJSFwu*OIb?Q_{sS=>{$qI}f%vG`O{KLVEQ1a*DR<=O1TC ztl_?(q{--d^S4*uVyR*>16j0(_!Q-{CHic^j>emFiAXv{xsaH6i9Y3_bWlTXla-`^^Tby$17xwY4-4*>vz!e@EMB1U34#oEBrK@&$AK7aY^`x>$oTkP_V^K zI?Crbks^bSh^?fbC*!m%pW;kogfFQk=r3|&UKH=M>8h79@$(h$X^ekDF*F_bXUjSH zmBMt8YbH*)cN*Q-+sGb41FxR^?U(PK|LMuwmw$bpAjSCVtK{CU)J)K_g7yZrrSrL> zh|DNh86FJa7yi90&-DTP#JRzJDv#)QucbU{O3=sXdeSF9NWone@XwQgx~D2Na>LV7 zT&4a6bgD54Fzs*Ch5$`ex1$h*twzV>q&>wjyw`k zCzVCz+Z)YLs`;41L-sf&8%@GP9yZqn?cLqoh9V;Z|6feTx2RKnI5Yjw5!jERQ~OD6 z#(-a%jS-6~X
      =ZjnIL=Wr}g0iGIYV1#n{cG;bbz=&j;{qMt`T2{h&Hp+&*ze-9 z+ZXiq-Md4iac;u^dw-{c&+5w!ue#OJu*ISL!4RK^cI!1B3_FLn-?fjrov>qm#($5x zcMiJm-rc*RM&0ybYgh398u|xc>Aw1&sIilNdCTzrPB^>-;}+#Mz+ueFY&j~*?PE-r zl~Ho1P}Zg=3A2olJ#2tD&lWk}Vea6@Ur#SN;7_!@+&PZ0(fu{;;( zXf;}%u;0OSIXOmaQxFSEsTnQu9BT+y0z!HSRN41$p8xplHP-!tLaTw^^2l&uhilf5 zR-n_lc0npHI$b#9M@Ls!ao9y+OW*5J#sX~NPWNhX2P(nkQv#5sqmT?`+Rw_9l;E`H zX-;nRVU2rE>rFrfSpK4sG{WFdWOfj%Jf+O@8*}K~M36WPWB%v*M%tn={%ix+0Ym>A z3V(qo_Dl}!98)`_H)!Kdui+V0LUn-TqDS@GnmTn#{`J;>9W|X0X@ECGrEc9NR3f5R z^&Z6M@e3I|FzRW`TEvcB0_Om?Wf;9dGn_BB?A6m|Lu2AUOjL4^bn<_ zecIUvYii*FNJpf)w@?05tF8I_8Vx6@$#?C^+qXZ|DvM8zl;k7aSk|u+%+#M>ep{d8 zVFwXAuLw)>3b@I|6_6S?8)4jo?TeZox&~ z?Yw(8y3?ID5?~_dRBAmN z)!BiUzyOW92Q-DN=Ad)1fA}-Z;TJX=B2dpU9-8^9?L#{83pnpn;M?vTLie_*j4;7a z8R`;X_v1fw z9{v3@|Hm>vc`qk@`)3%}Eg(X`=fUE3-d(_d;jGGo?ibuK_K?u>^w$+vd4;P0*I#$uw_ll}&f(9u+i*|a z=~iC6JHkph<_Ct!^{-&D8u&fAu=<`)1vx5o6ZXU5yHVOdebRq%^!sk_;itF*2UmkG z4dc{(6~vTZdWqhNPOY4up#;_5`G~tn-}jT9kGnhYzrB`V-G2x2SUN4~ro^?M6*;Mg z6{rlWL1P>J;LI^n*HBcA-@N)h@n3FGQOtM4fOc=lRzy%LPX&*r!_{qRZxT&~Ex%(F*3m@yR}{yY46@5Kv#{B(yw zJ0uXHNt|TKbFDBbC;%SW*$ews+?4@QSM*6KduSIv+&MDjsl8SWA3#Olu;O_|H`QYe z6vlxEd_}|A_1Y`W17SKV`a+QXT;Orbd9YKFJ@bXQa|bm=NOn)Nbb*PYFoQVt3t#*% zObtItephV!PpI&Fi&)a~fZ|cIlH9y?3PtZhswOL!mz;>9W6DhJ5`QI*8}M?AGIaXx ziMz)8?6S`i;0fE|fkz(alYBuQ!@rTv>wjrtXX|o@jhmWosrv~CKNmqxksnG@9&#)! zf#T5xLhg_G0!Y>=1+YT(8y1{HuH^)nO~kxkE>9_fuPb?*h`sGd!~}I011`pBZ4tC> zB&Gv;^DXHdx>!GX4=Wd2j7K=Lu*2q;@nlAN9-K?uIaC*J9hfKGHa5$h6HyU`T?fT_ zB2k-i84pYcfvgB0vl{~aPm1w4FEy4|SGpO3v&`T+DNCsL*6xEZ4VewQC3}-v*vBRi z{IWI`&hSC5$nPnsF@>I#2>O45T0@)`#xYc%YpUUp+mZZU3V*i|&jS@AmlGO)H@IKO zj-$ZLH0*NR-3q{t_72))Mrhc!4v0j^j` zWTy>p+vK&S5GyvK4t+^$prkU3j0Nho30+5r+VQ3C);X)dHB?{IOLIpwyEM+1^_v&X z8#_)!Gp(c%jU0OO;;4wBR5d^5x)j1L4C{Zqc_RAjjl7qf&5Pv>Ge3_}E4{#%g#;MUm-5TYrfA8Cy7-B5kIr>X7^J<*F zHvrwhho^q)*ti2Uqm5f1@wf<|*h=A($8oK6En0<}k#T_2Y3V}pQoT8cvvR^tyW9uP zD+q%%?pCr*2cu=z(V{mqsIZUDX|j#lw?N(vPE8%WmZ{Fe-Eb@Oy9kN$vAxq&=sE>w znKBjMT)rH2l8HICBC|@7OwP}CQOJRzs4K$NK8D?KncN>d6q9agUsLKy2AxPL6Qt%q z%@t)u_R+0}k00LS&w^P@eM1}4dQt6cdXw7@jwENPdHEc!T~r2gVuzoynr)54X2C`Taf;zUc%lE4S3Vo zp1LOm0vq`1`o1r}xqO?RarjU;hQL>ME51+G-<4e)uv)3sOLtE1aY_nx?S*c9bNLj_ zapX6Qi1AGw3?=@laauLB#OsD=cBF9WXsS4JE|Kp4qfCkLnO&5bYMn+SNpL;+xRNQk za0%1FPwdtTn^a$z6??x*)Nmr*{YG8=2XytKn7_wJpE>$&j|mS)CZRts$gcB`Wv09w z>vhm44L<`?MR_<##{(3C?X;K5=6r-YNpry@3~Q4*klbJeg3F>AgMcP=-U9dio^ZaN zOhL*WZa8X~MnI;k9)8>xrsHI_-Sac9GMv&hSCdT#9m~hX$Z8 z{=IFE$q}{F%1d8)g0&Nq6L~XBBkjX{w11n@xWeBcOx!*)xP7#{^7tYE`v%Z!od>eA zN==JGH()0TZ{sfb-K#n@kuP07dABri+6KSjD?48L%?W9HZ4WcatM5vi7g@j*ypBvb zc5#4b;!-Pn0xyMJyC(Qax5uEDLb;pBxiHopAP~0*bJRMBP25xA?$AkM7q80p zs$3UFs1#HOI?nzprO7b71Ys%MZbWkp?8Ps3Q6s#PHTNRWGtyQhA17lk>|#DlP6CTec#PDL(BsAOy=IRO>sa zJ_*q?M4& zHZGcm3TrU|f}GFB8Q%cJBt5cqNL2|+YBMz4yS}1DjRjUp*bKBi^A?H_d?@;-wmQd0 z3WmnXT*0JEd=v1yCBcoX;P%%}BB~-$kQI{wrsfG@>g2#j!fOX;_v69CZsW9LZB%ss zwu1fMhDCtKU)SI1o3^>9);C$`J00qkuRHC`c45WA)nRmrmV|O}B=-h)Rm)D@@+-)6 ziLW%)KX6!PDWeX1=EO}d^ue8&8+I1y+1+c_8ii!rdV2a*ov>zuP`_sL`~&cvXIaU> z7UX4Hj7z*{n(9QAM6`cyv~^xi>7pWrhBiBG4kvY??QE}c)1)*E=A}d7Hg1oUx6R7; zwta*!L(SO9ZzwFCdPw;c=oMMCY0*NW%C}jm0i-kB0!-KIbI7U*RNY zQ6#CMDVaGORJs(;!grj-sNS7=F`lr&2LmI9YBhZ#ExP;;)yR{Z?1lfK%|IaJIAr6W zYx`p5j5LOyZZf7#AcwU4Ez#E-yLt`s;H2ICJsi_WWn*a8WW=?Gn={wm7rc--w})K_6K>>`VA78T!bxH zH~rUci?w@V-In0xm{y=%n6*c-AsPW2eQHC9tU6&FCZT-xXhMZIC%Nke>8wFPY^n|y zEkDR+NOYU&n$_is3RPZqhMb@U^(0uRl=xq|zA13A^YZ!QZ5D5LcL$jGF^Z-$Um~*S zq@5w5%dDwRb2{#JIVb`XrW2ZAkw8)S&xn3UZ7>{yrio?z-$d|cuvM3!_^%m_#kZBozj?5s$>&*u3whtg}o-!2i#GF?bEKT^Rk$o^t{DPKX=L(tgC`K zLkAxIGaK#SMwx{lMv5$H57klqWj`tM2;Z(rr*B%NKUPVEY}DLM3OYgg>1)=s>^i7ch)P$5URpJ>Ip z2$8`B_3u1~-e$QP^nZ7E`-kUG`*HAGAD{0$zWW#>0;w%G--~k;#wE2C**?e$i-I{$ zHo66(abT{>-}O_igSmF1UCF>L@V&kAI7zRC=I!)%?{4#s`FTJ2Vn4aF&%SVUx@hio zvfhMrv^*&m>eak`$?cu)5mW3XIc(l-mbOK6-@MoIpP}GQHX26u9ql*owRi1z?W^0j z>wD+Li{#$m0q&Y?O1p4-Xo=u)@Nqt}GU-$w;2~o8PN|^#-?tZ}g&WL;745-q9Z+rX zVc~a4mC4iq`%F}{C>MQ>>&mCF{2(?+6pk)(y^D8x!;i87tNXJzxHD`!z=GN(Q@zdI zg(FUCnP}fgi&QO6Ia};y@!P9)?=OgCtSwTkeLE>Due<6ccm4gvx&$)Rh2+S_O)t>) zRpnmfOU_%Cmv9wLnV4}7=$Frv$F%QsE`6C-;@_v~>)FOmdQb94b=*CJ(emLwP4h9k zIg^hGM&qJ8JQw^EjGzd6hBkQ5RK=3^nO)fMi>9Uz%S}AkuwN3tVPsl$BX91*7PjE8 zX!m&b#YZxQjmHiOS7N5Ba&z@>wC(6S4jK~kpg~lnQ?lnvjvit+PM7FHU~^*eTFiiz zIUza|aw=)Rk(Wa&ch9*hhp(j}@w^Z44HY(w_M*P)img)~PEc#4CfDzaGN)@V7HrdA zavUiGC^!V@{-EO3bO4X4w$dSdPUPo!i8AIfB{!|)4mao(ss{_Ak!G_)KPegNtSafD zHJ_@b&e-Tw6%s$?iZs$@BV9ResCDH_t>oX6-G^9DS2EQNSI!k@z^e5L!pG1~a9iV*6{_Ew|V55>fY1Z@tu{;t)^`Hyb;5{6%T(cV*2S||={7pz8Cu^vk z_b4ackxu%%WA-#A^HLp6&>vZ(>sHWtDT~`Fw}+{7Vb7%%XkPz!Wd{ajgBvy)kYk|&Ydj|i)uVje&V9%2o>nH5?x8-zDtr<8Q~$Ew zzN}7zIP{f0iQq$~Ax+4IpY;ZnuF?t#366UzH4#^$OYLppAxRdrL>dgd=_mn3De0MV zxH%BbfkOAm^^3MxUJ}Cq+XXiV)@g*2pTU2dh-Eq(ETt2&UY5kYQiw)IOY>I#D^87 zM0zP{QVH&g=aM+Ocy+MFo;5r)PTtmt>jTcgyD8D-kdXC}=T}D%Mbd;_c)Y5ByhqBT z*U*#kMS6*O_R6IM1DX~D4W)V%OB^tDL!2h)W3s3ds5h{^*yFHqLflv2`&gD&I*FC zU_mVOv7H)j#YGroFQmoI1f;ZHzmtTj>0hxb^TR}^v2{kU4d{)`qq#jx{OoBt<^&rXUnjJz2+kgs8aN>-}Ha`8U%oQ6jJlcN{@5x4;D)skY1 z-Y_s^=$aa(ZM&)=d*ttGwq~RBv5P+t>v=~u^^a5H=z&wc^L|=f+%fK$BP2pKJ;$*C z`>H%kjjPyP#WU<#pl}nbA)79$jCYqJD%K3)N8LKQBA3|@rGTgG0~Z!z3vuvaRH8P^ zy~}`OU4IQxMb>xx6#XErj>F_v1ohu_NUp7#@f?@k7_=q{!tfZFWharF7BW9QWqzIR z+T_2EVfvQylk6peRpK#;&^Eg;Tqu;TFQkiKW|WB16-DQAjTFEe^SD6V2EHl9>Hz(T zz5d}z;C0Mv_83?UOko38qI^mM1%25dj7)(_zu|eQ=p~l(SYWNF3qI8*J!Qt53UKBY zjonBia0P*kQf(=2v|xBCtGF32@zwWKR*=6v&$<#XRH(JNXw+l*_QF(7Ezg(agp88w z5RGGW_)nibGR91*jp`eE{NFsRPHkKm&|=Rdw`KQVINF)$Xn^snj`(|frK7Gu%R~qp zPNyRnkunMP=YF!Kzuk~mRDz*sJ@Z#^isWBeGfZ#jB(k^!p8)Zu&x9xIxsC)MCI6i{ zA`5fO?5l}RrxY41srSOInDfW2jpmq2fuqkxhe_wxN`pv>9fjSXV!xs<&8FI+_)mFJ z%VSeVQu%R_kMqT445cCgE(&x*d>>!qAULC`o{)v%_p{fpgl4%IF~S|b5?wq8_fgoE z08@vMt?-~}_p8HRucZlt+iksFNw?=9Dk8tE0Eb~Ef~P-)a2ZGl2QI_^XIPa?g$W&_ zzZJ!KkeH$BmB@+|c3DV2Wb@K|&w}uSW7yhHWY8LzrZ<^Wh*hi(5|ZXj9@Qr%qR35y z>-AK8La_VJp#Vyd0i5Q2S*B;1@NFZD+rqc2v0|xhmf(G5%-Q9g~&j5qG8>Mfu zDP@i4TwU3{pbOM_e5(_PZYzY`HP1NN2`z;1CRrR5u}2T~qPOmz^A}pQ2F_3K(=`im zuQu)X8@O^T@K-!3%!-G7p}tPKEs%81ixcEq2@Me))c64MhG|98CNedG?q}hSs?gw^ zq}!aw2KVmhR|=%^nR5jxp5dE@$%7rl*ApsDw0RiOQNs=$CI%sj&rT_Q!|x1!h>@f@ zCUnO+Xn);?AHbnt8nvMA#0&(uNJADG$iKgxG#8b(TmJ1Fh)}UCWf>c5`>!?SlTU)w zXxO{bTS5MGk_VA)*(Qn+D`r(l#Um&v)P;;vK zC~f*4Hmz_S_m6Pr@$U!p8}Zj})}a{ngAV3@?FZLa*IJuJCw)NpV$LVSE?aodfbbn4 z!gvJe2vgEP13z6ct=o6(J|^Ef+ggY6simzg7mOhq)$!C=71gLh%_;5x0KrP8Z= z;j#{xpzlU^@c*U+fr>z<2cfR}$wx$BoXm=;_}YD(Ze6-s@S6kt`iehz0K&xClnaIr z>D9yJW8?EL?UT#On@7oI!(+H3SM0tDzgJmWC=iz9ULw&tFm+MJFoc`EqYjy+jWjSF zo3{GKV0cMgTibDP4pui*HP26A9#FczOo$W62>BVwwsZR*&{FGnaQ9>cr%mcw(jIQp z**-}LNe;OtBr@YmJVQI%yKdXw#~Ipkr{o|Uk}dJeIebV5W*4)i+yxe;6LvVw5pI=s zI9~b~HcvZ1Hdw9HoL2GWk)4-EIAbd+F~Y!ELO1~oQ2z7$I9~)fbUJA@q#m~vYgeLv zM%}42?BW&2l9U-A@g`y}*U|0rM$A)=@Z%A=4I*|G7hoO~+*qZVjx8JE2=z$bD!T4-C0 zW25-*op}Z_bxHe|iAYDvdEgkWQ?u0gs?*U2G`W$7Fq-6$YdaYi#4{+;eaW-r>ed=H z%|-_?uY2LK=$!l7YgA=aUYf@kbwkP_xB>LxjKL+Ta<>#aVJUVzLDEL{s>^0gt|;rW z&T}?Bgb!fE09in$zj^dUB7LwjIRc>0G)8isBptd)kRs_)ch}ry_X0D{ypHk-vDth>WxLR4K3m2nh$JueiJZ z>KBCghR6+1XJ!QakA7Sssm`G*N^FOCTZFJ%{zl9~olr-F65jdws_tP+nBGzKHCXke zjlkaS*oB@&;U_C*veHYR{rkj+|94geo!u zUqKjH9WKW@)gW`AJtDT3xV$`EEm8#f<6k=R;QWs5I5Fv=Vmp09o%m!6@1ZH zfl#wPJrBOv*9`r?sIHF406Mn}|NA+8x@w+o*syW;c4Q}N2e&ASE_?t@_uJZpc^Ag? zrY34|(l-*Nav$U+5UYkiB(I{;#Aa8 zB&IME$U;gxqG;5q;8RMSwlq$sW+JbiUw8Ktl@ZDP)Rqj&uqSU|xe#2H~pe628>I zy;oIE#Y=C)OtUiM>u)aoW?5#Mh;0+ciVhN7fsha;L(;VIKeQafj!WKwj7TkMhm>XY zEss6;(we3h=f*wWa7x8JduT=*d5ixX(x*Nk)moED5In1Ow>Md9L$SsnR=1PF(c}Mp zYSn)cd&UYo=wKFf$U~eZ5I8#w<&S=3im^ty^~$1amC*J8<!5EPt+mOuH@1Cd_?-bl+i#R}&~Aa3ek64Iim-b#3{(aU-(xxh*Ip z>k_g#9J=>mjcUhdYb&b82kFbHLf+Ev=ojgDe4JV+3^`u<^&o=|?k4-FBLno4vqQWZ zmBT!Xoo?3?6?XK*pj@&O^)w5Cn55k1AqnPqo~7^YQxi8DLKL>Ps4qIwTKdDvhOt$~ zgCR>2(RQls$dLi+%3hrod~&DcM^2_z*|QoY$D!`v^3c<5dHOXztYBNL zS2wb9rdKuWlbbcY>NAENCC(BE4cLoxgc>G_G+fR=(xGzWY{5CDg!l0ZY*-aGGof4fc{WEA zCLLK9o=U-N^D|MlQg(Mzk4uq5Rb|oMq&J~feOWnS;W)=y;x=qq_7Tf8LY6(`qzNBh z$#%kIl3tRRhqnzP5rXr_u3|V&`N*ki=b7r`5Pgc%0pU&+eVlFu`4H`sNa7^-HoD!L z4lT~FQdOWu-XXD)@EeeoCU6KSI8l)(kP$_+WVFLj`Xt{_@VyQEFRl!oc-^!5Z@caG zuMhy~Rb`O|=V|%+V*0(LBI-1+S=XSNKEr=Swog9#s4|TNu#Uuqg}G2AcVn6{?{<{@0UI5CDexh>>!GwZvVB=IQ{ zNdqn=EoT#yhlFWHIaf)N^!?m#9N))`3 zJe&J7dC_+f2-x1wEsGX)GSE*n*xcEF~GUPtp|9?E;MI>>U1 zARo8q?&~gJ*g&pszSD1HR;Xuj;!;ttL$wW>Ddx}w8)KwKRV7RZ}mTx=~&HzF8S|M$$N! z3lxjdZrz9*#E<$+(s6^~pViIfHW0pc^ql_W@l23iah=g#kFvRO6PqqUGuwcu0;>F4Wk|sZu95*|`nO!#=A`9am|HZG;V^VE6YblBhf;<+IW8x?jpy&qU7#JcGiP46G z!P8;rMxR}is;{LY#m`z*52*++SMt5yDvU9TF40%WXBz03a}NI3ppB{D_IEc5TnLd1 zk@G}|$`EswG|)ATO(@H-X}+)y&Kt+|*}7RoS0r}GCBJaXCOb*rBLt$<&_BNHkFwJg zvu^Tt+yjaQ7kqw7L&e`a)Vc~OF*00vZvCe{TNiAiF*aG|J9Z>-RXFCo_Y_mj>K`C zklaX6X{aPME~|a3jh$*Aa9X>6h0l5nJWJjGn!2c@uI{E@e|$d(7IouZ4bi7Ue|TqJ zN5(cIHJ0qUqbSj}?oOfg+dc>kB@xOme_cD0hTePH1aBuP<9)PB8HimGyuHh+K+c9+8+0%RC`9nIAUozI;B%Qfd;n>{9+HP~U@a!T%oWuv> zwAv}NbWXW;7bglOh^oTKnMt#QDx@jVQIr9yI*5;4(QK zK-WBy5NiqEHnbR;i1(>Ruz>*6#|+zGfK+KpjFU245Sm+OCW$fW#Aly%n# ztsMFy`XKndg~>=FXJL)nt4AV7+Ab;P`;4yK|DrDM{ttC|{D=2debKe=pRwlADEs}K ztVVnPs==N8Uo^O_Ex(BW^Z+R%IwKc68I2^E*j<#SqvrN=yC?$ z`u8cwv-%sA(!iUJ^zVF(>yE>t zrScF_T+g$LW0{xPYh*tyUR1QTJxvQwpTXiUBqMxTyh!IE54?qiku^@76vQ`QoFhyD z>RgjKTAoWsA%LMr2k7`IWz4_OAV;Vhq{7y8ydk43dD?`InR!s3UuTFvm2pD-pM*}Po4u@oMbZXA)Qj~*?5@^ZPV!#Jw<;`0aQ&1n$_ARe-1S1P+8oS!!RQ?gADrL(xeFGSUsU3 zs3XFWlReZ@YDEMjpZa*LXtiywLST=0K~yJ!&7~vc)Rk}*6gZ_K#v(MZYL0TDvg90jd!DgP z9O(zy{ycDAPk^t{#6XBShPNeWqt!rul-B7`hWdc@wy`4G8F_{+-NWj6qix7SNMJ;u z!a}&Z5tWNccgP4WhuP@0#qvWpmGCO80@3TtfacKAzsfiH82mt}wVuQLh{1>UJSXcTCNZUl^&u!lXe)r79IuWEQdfCqGo;O+ZeF@3Hk$bJ5h+-Ss6-UmpxQ0G2X zZ5jSVxJC!CWeqS*KWI6qZgcw?7bS{YiqE(W=k6pUB}?#+x{2MfN%>uKJzkj#2LZ*Z z!>{Tc%!1j}iHbf#eAa8jO+lJlJ=F4sW2IG07iq7-(VhAM!+xJ#Cc$BFOF|@c!OVZ= zr%V!$V&0E*ew@R_IKMPEV6>Nz@{520;Zz|SHx@t6rrBw}U?(A*W$cMq|7n)JN%%%< z^9L8l-S(^2#+$zz-K^a|yn^1-@xQh6k^6Ji8+4_I=$;>Xr^)|Wy4T=8iu=NQ%TN`x z+`);o8?e&QdOk%==k1E;UZKb#pHo zWvD|3*D#9a&ewNHYeOK1j1bEiex==$e#W?^`p|oD9el>A58hDo(z`>g#N*l2(r~9- zcRD^tze@M5)xC2R&jltghI@=+gq>tF>xo}o(*V71%{06C(Ye+Ha5{J8TFvg(onU%x z=Ei2p=Dx&iuf2V*_nP5(6s8mQ7yr6uGW`e|QmYBkqTbs4!`~H&+ikW8zRcGi&peQE z+kwWy_8iw^3+ z)6t5mn??}vP-~sP#NVj#^idM?Yyvwt?*$hynBiBcO9qH7#}DQi!RO}W4WJH9x?$xG z#xVSRnxji!@c*KV75kMix)F8=%VU93oX7~eL2^4imAQB!FrDTdGd9 zQpd}w7qJ+&P)D@sxO(>02;_uDPffo^YCFIYqhLD!N{FAQ07 zdkK2MlYoY4+9haUD5ibtt=rH9ixd`H_YyVWb}jj;)3*n1{KM#5DC19x##UlK2ZKS5 z;RE6T71 z$AYe!-ggrkti8*EBd5DQbPj3n`I{}?oMBH!opgn)dqTO`TYj33-P}{W0t?obV%N>9ST;8{I{ZJrXzo4tdO_8g7)eYx7lO< zTqw!N%}S>ctrk8)L)%YaG%PYmz>-;ADU{ldy4P(Da1UC2h&FX3q2Z<$JY5+uV zApODw4v3Dm%Sr-1z8&BD#L{+m9jok)qm*0GL4R<=+^!N6S%^Nmk#HJfVVaLYuE(Ha z4w8wD*LJm_?td_DzZGyt?I8} z^a`QZMCY{ykcxlB+T}x;vK60p%rqKT@+(<1>s2%vVyKYwOE9e%vtuTUI187fn#~is z@^1SRnu_FuvQw!6b>p^ra`7SSkw~aFn@-XB@)BM2Ly#A;mnX|P- z8gBX)b8*sqQ0JNP^eIl0j*Rc(_D)+N9fKB-I9u2a`ni$zWWUlK(fsvPd4LbU0YQyY z=T&b6vwr_10W*>riIf47ypEc-yFFIO)HE_->Y=kjE~leILgG8>uu3NGFRJN9N8@~~ zeUcmN%bwA*#C4PcRZnud;ZHHcVPUI^buB=%m6R zT4yb3v|bAhg0C7?bk+P^`mNIM+d!;+Ml#RX%YxGp5YqjJY;F+<7OKw5#)a#GSKoO0 z*tB$2c{r%n++0z1jM|L0DkDK6kq04^rxiw@(}|8sYUkVrZrH!>=Bn;p+qKSi6z-2z zhWFNrDI#8zC?=th=+&zn=>kuBK0)R<6V6dG3Rv>r%5jomevSSjwhpVX2*`BQ@n$9R z8ne+<6;d0~E7GCNM9`{6NjI1$ZN$&=@&u8(7<`7Is7dH&td~k;>)CNyeTMYVP1?WqG|NGk~MTC%(PTIPG-U9iF_FN2M7gOihLP#&HCgH{DiA&GcN z7K!~M;;#kIAu({)@Sq;OFJ4;7_MPM<^3o_0A`3*mVt2NkKNdS(g}Yzb%qmZy&&_96 znx9|iHoF=5&64tanh{NLsfJ+T3_9DMif-tHvs^3{TZ0^f7!}Gqowy|)vn(qA;c>Tv zeN2QK;+d(O)8ICcBpY*sOh%svj1%W6+$3xJlfXBR&Q4vySQS5-%C~~bHaPIf%8Wb; zPxG?*4fBV^wn~1;lsA5qm2I`L)vl$|;aRM37SxhqvDT=7>W~!rIi)T3#N|^%PPxc6 z0BdNdsppBZ?r=U-!4Dn(6?b&Bgp5pow{mOhxpDU~@o>bB!;K5K?r*A_;UH9H!8JG& zc{AFVEq?&nym1#naer>~UinUH+h1<+K~AoV?&0bap6&Leodm zXVuEZ9^8%a480(UlCMwTZBAkhz(#EcIwryS#2S{5%&6*t*nOIvU#rf{vdS+q+;k~# zRbph(tvEkBU-TD6f1I5z4ElrCC~^vKBYRiM@wKE6-r<14AEGr~X}+zjaefrom?y^w z;w1pGm@dP)!-mSTYks0wFGcxNpe~sQ7>kDl0+$9#FubCrtO5XXVX4DMp+u zFhUd~NYK_s4a%#hAr+k#TY8Bz3wpVT0&+S%bE~QBpfJHLQVTcSgeVvxz7fI!j#_ch zH^QbLB^5+N3_v~NkhbS(d6_)<{v{`yQ~WcGG!FQAkr$pk!#LVcEoU@gO`$>V&F00T zkaO?b-fLCB`I7xgYm`oj05r&R4DV8dOA?TWkX76#k(TdF@+cY1Fr=K9B#P;{k_G$M z|5#@8%K=Aa%O660xS&1Fnlrvd?+@EUnsN6i3|<~CRasdRtE|YPDKVqH&2i(v$U_Nw zV((qH@=E@4n55RHZbxux@BmU`2@nKxOijK0BmVee8+PKH2~>%w!T9Fq&cRR~UEwqM zlL}uw8IQYN{30*kD2)I1&x6CChqvAxz8mz8?r?qnj;c%$GeEvTj}9s4jVY6}Wjasc zIg1#uxkk$qJlisncwJtg^2x9t1f@H?Z*7D+OjnE~OEVfukfa_|7-e{ZX1DMc4xay_ z{H(TRrZ5)xaMbx-6Z5TvZ4)kZj-avd>Xfbz@ftYKqdcZQv!m6r*^to@>yhvGoUlvv zAxVC-NHOO!_ty7FPH-(oenUe^DN?wBhu2%6vgxSqQ;H^)e4btxRCh@C^t|gl<~YYF zdrMv06?bku9meLRCsn<24lmON{2djC_`zCCge}Ov= zq|{+#We{d&7_&<9CUt=Y7Ol1{;Hm^a8E^DL0dlw z18iEv(i0gyh$l-nESqL!V;o-zJ)!K8Z$7%FAr$e# zExib{25i-C(;7TjO)5;ODL5^so1QeBy4_8 zHMN}UzDGb~i>?R@Va?{->9_njEjvhAhR+wy3RJ9flNmt=~V9 zn5o#5>Vhr}1*OI3G(^p~%xYGfDLigao8ko8q~xcVTD-0NI5i?Q8bhZLnDYE521z!L zxuKKbg~VeJ8-HTi#l#r+$)|qhgsP`g?y6DDLk4I(ij42HR=p~L=e(*;AvH;7DsrAq z-3l9%!^$#YvN`Rl)4`|!Plb$w5D%Vk5w5*!1Ha;~ftr94D>R(`!LgKRZ>uW4Y;xA| zn@;ysuhOdq8|Q&LgY4~`a}jo;j;`Q^d4cz$8_}!Os**OU4tp9qivevex*+_yAzIt^ z5S~%CVR}Hxh^w8Vx?)4@K}EY%lOEV168T50w@VC-J|l*P;#Hd~>9`>nQvwvHPNNXa zCZbXfT`dTMeD7xg%7d2ix{II8vK>(Y@8j0h%*SY$sj+SOsifWs)!409IKL!r^UzQev9p@3w*yrPX6!n znYt5`BB-@t4Z{3|-{?eb{t;%W2yRrNWVi8ZIh$v*P8e0~n)d$q@a11qlngdEty(cJ z+NJKiMuSe2zJevhiP{r2VJpgW80xd-|Loq@gkTd&{UogKhg=bEuIqOMPK5>X@Bfjm zWp!|$&>db%wd)9}uPj0=s)_*K zIDUAXTFs zJikH<+{rk*N=qPaSLt$;7gxul{OTl~en`tJ#8aaGU{hD4Y?0>U^6E4{J4p$&AAc_A z+0|)Lz+%G$ZM6)E{OX+CrmoOC^J;=hu&ZhM;i_0JX3NFZY+k_fm*rK-u+UfKa)Njc zSBrd-U7@kR!0;P5K0xU+(Yov>+p-VdjkfmNor56~$}9Mz+ulASvt?19=Mx2XLSyw0 z+1c}tvrhXfD2@C?m;+=g4&S{ix4%AWBWv8o)t!qQ%1`Gx93TXnBm?QYa*NEOAI}$) z@mpH^ZK!b*SgZ63=JBK$U!lT%bag(z$|q-6gimq>eW$UfSHOg&lWwPT`0iqOwADTQ z`Rk)Q-FMqxZ=az(XTC_!1j7!hl`_=e;!K{no*|i>*C2*%mJ` zFO$850hcH9e73kM7niWc*qJU>;Qf4mnbS3aA;OY>os7pP0)u-+;JDo{=sUP;PB@dq zzNOWmNF>c)F_&Lhi~M|7-ht{4f8Ia3+K1noiekV$nR5@VyC?}ijw0sT3Z9FQog_I3{a%tRvRu-fo zDMr7z1noR4!iq~NrGIe21)f_gxWFAD<>a>%n`4=~p$zX#ElR&DpTOy8{>I8f38EHK zi~U(`oBDUJUe98#?a#k%>_kfe{QHj#Y;Z0vD|j$K)TB)V|KedGh@EtLnc!)9kaWH) z-kcQZ3x_*FvV<+C6eNIaKckf5Xd25uuxSk8dC2y_jF_dsfKsP(5Uf!joiEUG_KP^m znAt-%*#Mh{|I-k ztMlBy8?EsASX6X=oUW{ic}ywF!}JV|U+5?NEEdeXHh#bX`QmBejFjXm*y+ktcbZKx zvE|KWbpo-DR|7qdPyrKqCrKG39-f{C9QV>YxRQW|^H$Ln(v9N8^#*A{io|ol<3e4u z)sc&>BxI{Xw=5~k;1^YHItsd*cc>Jh2NIvIkO9VpT{0%xd1 zLT`ib1h(5-G0WXS_K(gE%$b?AEiHz6 zteQ)YhBBL@5LYYAVpTz?DNw?rRl@v67NSFaN}bk*b;=7IvH-R-&2Uvy5&1ntyvYCf zE}~X%wvSdoO4Wkt}&D7w}~ND{r;#RmA`q0!_X$h zhpgEF!s-juj5^d(*Q-cR+;JD?O5lS^I0Wpxm3A984`2vPA!WTB|- zqCY+b7Q*isUcow{slY!rFbl-^);9aUVwoxI9=m1EIU%beTEi#?9}3JbG5F|x2x?xp zi0ju-4x!DLMT|*DP^9DtAPU{U?zGnMblNCAuT60i)syBTcTwKWJwb`%K;RsXUtYr9 zcd1cIom;zi@7;T-$?4v(6gmW%`K!nA%xJ>Su;*%aW^U5oyZ%cv+G#5DHQR&OZciCd z9rJ(3oqVyLQ(|2B9TUaw*N9(z@JVn;`k}|H6|!6ZLJ_wjkDwq!&JO`IN#K(zez1-oZW52pG`G^mq0YnfijvQx z{>_E?c`b2|-R#9<*qVvY$D1sZU@;8BTQmgiQc9U6AstD3;TC0EPZ*2YdC-FI^{`@u z(OI;-i)%GKXtDK*>`EnT>Z$9lsjk}NN{v?GrYKDg69i^sm9*q8(y~zDA?u*vN~DP2 zC?BK?{gvtAFWp+H3LQ08U+jMU)%F*6ziu1+#sY}3Tunslo4l0&AZZVRuiP5Ed*xoc zp7MV-@vm=Loeq6nK~0hF?SvR!pyNx)+^bbkJ|hYi$4p2>PNlvs{MTCNA+ANk@<1L09#&a6(u!UFoFxV+> ziIG5^!rN!BUnR`@bKV#%#Jnwe=#sZJrC6ON=h=9coaP@B?zVtHvS%Y{bV)As;6%*) zN%w=75cjz$=u1z8il8#O0lK=VJc>3pSgU3=Md11m<>RCELKqqSID)Urz6&b6I)GLr z07tT=$V&Mcr(Cm*iHm5H_(0ug5*c{JH}vY2<|;urVbAFd`RZVYQbf`*s`XFwfCQiU z7vprX$fm@b3Cs;)V&NL&w}h54&wc^M8V-^MOQX*lz2)7>wtZm7dPIqO$$46`8H(}u zOZkmL53H6b)^89$Qktt67yhnziYx&<8zY)#&u=X34>~td!D}==m7`@jn26yZNkcoS z&@n7msIjkyri`Dm3*wd=gVBANR=dmCb4AozScB{?U;;^5hZkH2)m@Iqal#O5^dbqq zX@55Ay$yxwlw zh&xCXIsS_)qUP-Cq50dFd2A9aoT0>u&BNIY^tP4VcJ`C=(JHJw|JcD~%{a_HUafUb=VoI$s$G9KCNbQF!G1V%?b zie(U{Ykb`()eYXe&g5{4b>U zt0m3TF`PN2p{{|1p4uNz*~(?lf)FDs<-|hgxFZt$8jwkMVhC~lV{&VE_tDPdVe*7v zVaDQk!6IPeeUxZswvE;LC-wt24NZLPMJt|)8?x740BsVli1M4uw=73@xTq*is94Q7 z6QAIUe}y#FRT!BccEFN7Rjsg_eLaBg7YT1atsSQLbP>| zIx?ZFqX@ajtK=nS0`6AbRAJnzA{Pz$=K(;+v{5v-jyCpy`F4#4PF=omFZuq9>8eBk z`IL;v5Iikrm!z(QYX_(uM&vGp#?rdr->ZWd25@t*=7kBc7ZLZ^$(YjQ5k_F%O9+6y z7>}NDcF}kMR0TPxE$58|urIwtKc}LZ>VoCzAT#AIYg8g7G)yX-L#cj1X&y-Vqfe~1 z-#hhN;j0+c+UR#oJVOX2EK#kA&K+aqk8OtN%X^QKiE4Pwyhb?;;Cd@#F z%-GGA$K(7&^7L{jEn>{gE`tI_ndO#6n9#6C!JZdAazI1mriIGo%15ab5|GP#I%XEF&Trqjf7UJk2h~ zmwm$bBs@T44|&x|&mn?|%>BSp5WpTCxXAv>t;@5n$YNS{k9Jse4~FHDJ+!-n`Hm>B z3`mc(LCQp9P;oBhs2WS4I|&mQj0RE<)FO)J?}}H1r*}eZ0?1sjb4SnT^MbOKiFPnA zMJs%3_wMe!yMs75CY}*)U$vs)Jk^cd^q3%{MR|_%V1N5v^cM9PvlK)jWUA6RjA}{< zft>mZ`ug(u<3aM1Ut5sDxhq_S8WLc0Ls^D)2yK@OgjqhjWEeqB%2zH=VPbNms;yvm z&FEr*i^^&3Q%MShLqb$bVzi2ksu6!;qMY)zW0fgQp?>PDUoh1>_wL@;DQqw)Jz%k( z6PreLqMb_pQRn%j6Ibn&Yw-(N0sC85VD(y47(|;>@T`nEPzW5{BoKh+R1E)`d?ZlYb}?;7M>FVcv5S#W*u8ge zb!XI<&_pbStilWv?9grdoPi_tHPyna9MNWRCRj^qs7Twmv9Jbjv~5|0GW?B$sFd1k z9E##POX0uLB*-8{e8bq2$KK8ZZ`jfnUOZtpwl=x5Q8X8etmIzacILr$ z6Hb8XS#N+A&;S#_Qd4YSiLki1kIo!d!LlK3?!IWUoT9A?p|wwX--zF)w((n99jb_N zlN4$u@+IF0Mm27XQ1cGM1RRMB=u+3gm7HM?1iYa!tOOOxWSCNbqLX4g&II{CEybYK z!{d*F3$Q(eK?byfp?R=cGIGUuz~V3__&v=|-|KJzj7e8*t)ab}-XyG5EX?+3mY0O= zD%K+fV{THf2>uw10LYmOy;%DZ>r^;JxoT}IZ4r8t!Uw<*u5G9KK~o#fDMi_K9xCr2 z-ds9(1=nCZBsb!Glmi^~P18PcgVL)N4qT#ZQdi8K9 z#GSPY0H;T*yq8@Te9M|Vp;U2Qaoz8Fd7`pfYCK_0OIE_%T?ou|LU}eQ3u-opeE~i`j5{`_~fRVuGG+peE^f-2YJa87_SLt}>vequdWS4VyG+Zrz@BCEQ+A zD+1!z!QH4_T2AVuitY`_tlFqTwK1{X+A{bHQgKXUpCvB?QdJ^N^2aZT_}qH@;L(@C zBPw?h{*TxvV~CsUqWJRX=@$iS$=s^>e1Yek1yM|9+kU>-Hft6Adesa8m$RwP3r| zy3Osa-g~WvjnWXYP%$mUq<&LqIh^M8VE~_6^{&N>E7Q&vwwBMf>||`lAyx=Oe5P(( z(S2OK%u1Iu$nGS*ubACc|EpGXfK#@d zDIuo$#0Sl>)h=%;mSq3bAbr$A8tQ8Mh?`?WxScY3C-j)e@J_H(OCmgOQS*-mTB3>{ zAmGNVG$`h3JRQ~7tK0wwAwp&tQB)=^(+?8ui~ zLLE>DD&>SLQP28Ky%V7WX!^9!i;968b_WU^@L$Z42n!lpY2#+qH0wg&H>A~PS-=;- z{I2PAgvk)+nERuIZ=CZBF}`(=YZ=LUhifsBOE|N+Z)25YXVxfq1sTvD!T=+N1j|9? z%0XT0tqld~leTDo&-RS36fONE;~%y){IUT3iE4}#nP5#fYP)J zSN0hvU!~I}+~Aj(ZQjxeT?A)%bq_wigiD^kYP6Zu-RKcUZN(uSDi!K zyY(T8)BDTkw?TGaE(&#KP6P-;Zg19ltN-Sjp)&k}^Kik~2-XK)pxPi2oQ+;`XOdpt zVQ`dkwwxofrZy^{s&l=_aq2fkF%eWSo-p&K!c}z)?a-WUs(m>|_wBC;?BQ!v>wZOG z5!(EQ?qO4o ze_$=zt1BU0RDAF&+aaO>m2p-|HXavBgTT%)#jHODCU>m-06Zt@gCx9!9FW8zQ|JxR z{|dpW@z3IYbnn5#Ve%B}m^)`1JdBQA;OL==rPZYRt3!&-qd#P*Wv-|KP6eEXRQeqB zqH2D+)X-#c4B{mc-s3Fc8;p(H8WllSuH@nNm*h$M5J8NZDTH2s+;VK{B>=a`6B8ru zMM>T5)s-V&TGi-3OUx|vgQ__sKIkZtA8*~?dGuw{M;jZ9CNyv_Ohv&UWMLppGTYuL z8d9nvQA|qr5(`H*yT7qnfvpT$s0sv~=R8q4*bhF?xX<$GQu7P6-f_6Sj9lnBCKKwm{A~_>6`i+p^-~+LWtX zuapV!G{1%o5vXh38#E}>)Em^rI*Zrrb$QBV1U#)K!#GsEJqu2iK(GcGW&2JDeZK<- z@&tpmngZF?S!u*tx{A$0>-bA{>D^<cyq!Dli?3#L`^$U z*(nVUD;rgRtL8GYU3nJNODej8qv_HRrLeZnQQmwNI51lSPA#8dLruWx!GGt-_1J~J z!Y4O!z43di=6$n{F9>WVZ!JoLn^PhTs1fq51-pC+WDsKt?QB0aAh5n7kb@nigIl=ebtE??N%F&zO8i7 zyG*3WlWdIMv+#*NV92^QHCq5 z0;2UUhuhmDWK?lq4<^NL`FNZTiuu`gHtqlTW_whel-n>v+ww6CQ?VQ_NDlxb#XetA zfpM9(4zTDLP5#$UR{>{>kv6%LyUfCJ}CG(*BuX*x5J?We7GE;Wocu&{VRP zXn>>j55-~R1rE2?FljlWw?>UA7$^^dyy4OO|1alh(h?kB$|-@JbI zpXie?E>7OJ6TYp>^36F=5qz!t0^Jji%VG>C11kHFm-%sypx*HOJRgm+X}hOu6xD{6 zeTO!S@!NSiEzx|DF#0DP12{8pW)wp_R73W3@l%EyZeUd%`DeQet#b4upUKPLLKa;YZNYYs0TG9kQHTz{U zVa!U>#?1;8)N<0C0QDY`NJMQk89cef_wby>S%J%xlmY@}ZWkN*&l1`$vE0a)BQ>uy zqmGkU2Zp&}m2vPdz6xHOoZ$}ZuJ)JOVy6N)bK-l84+n_B`DB4Wev9HqR7(kB!4|*f z9N@d;`hn7g`&3;L+}yk1zJww zR;yNeuL}2lQkG^=kR#Pr)iaW-wl`1SOe*q|0DJBN#+rGoeS8+&Or%k@3h?>vwIqHz zDCapUSQv1Fs?l2A+MDX0KA;qt?17Jen;ze>%Is&)#gA+oP$srPv*9j`9OuoRJcPEuQ`~N=NEZH z*g_{MDj?>|F*>}>DMx~`N}JWOp{ulZJ8X^!NGKYI=$JN~;E5>_Od9}4^yHjbKMJ`i zIO{Zaj_z`!?^8B#%I;73T$bk<=U2FZ(|`$5A}2-hz>*_uGeBWhOK3IZ__Ogg4FHEp zy2|({JL&cFH$V?bkShM4@xx%&M=BCI<0${PdR??DvatKL&PF1b49zX(W_;46nyR&F z&3NRC1FLa(4Q;90y!8rsqrRJAYfp-Dp%L4*cX%H#u^Sh~j8inKxW=BIQ#9{jmcUbx zQIske5&7>Y4+dz5$5?$d8a9|s{pua)ERVG_M%5oA)m_1AmZ4N%zp`{-K0#ds#0+aU zta*QaK2#O2e*J4s>HvgZjx$S!6Gm(I*j3KDYQ8L@>5CI4ZE!`ba$}(-)+TY@W#TI$ z6oJUpTT9P9LCYO}#O#7Q;%;}_dxLP0&ct!#mV9UC=wbv>y}25qnrdvG&?s$WrCR}M zI(*WA5A-$XE@X&u*ix%-F2j8;DWx6I3zDFfaGvpp_Q|3+I~&IsljKt#v~kBpF%I6Q z{FcrIzR1#P`x<;)?*&739Y`fZM=2{g)+=y2*!Rv#?@B9%!|yoSEm3jZrc_+w4Pb1h z$pGg?@ty;M83Q*j}K8Cs5k@f=?ubRi*oCm;@@k%w?oh_97a`MZ!bjui{xZsAgf zC*l$hDLp($+PiH{vR1oF1o8Cw$CL4LBmi6mDyk@;D#%+BHil;D*+&)~smDAk?Gq3` zC({60K&8K@#d5lkKzyW1ZQ#nsuceFrvB{GDDe`H5u01X4pBMAlIS8!&(M3KA7y$I- zx0guVqbCK3qKXor1DAc}MtO0LNi$gDyDXN#UzO)%t;jzL5SOSxc=y1*I;)1Th>%;% zWCyVZZ^Et=aKoZV;zU`R5`5aOB~XB3FQ`1MqW-3vinc8O83yyGY@s`wZAbBGDUcCB z%h`A2w?c30dpRO~a0ch9hDP^@g40eclw@Pb3wpwk{jQiqUZgHXbEDVgz2?V{h_k9Q z3>KDZhQ$h&+C_F7eqI!F!cAZmm$_`~DnD(mV9$UHo&F&PzU;ofX_qVC&iV4hQLYd6wLIeD@wZ%*sr(x%(Btu(IvHOTXis zeTd;IY5)vF<%2pvoX{Z*e|Ptx4PRkD`5VDD69$`GWH}D1_Go3lJH9OL(#z9ug`t53 zGXPRpLXU2Y+p~|i)pFkvg)?qj1%-ke%~9ZP!!o&UZH77JD=0cd@iM`tXwN=Y=1;tn zA3ffA)Kes@V+^66W*|V#E%0r8iHAn8J}{7)w4x+W=`rZ3wqQwc#20k0PqK8%HXhvF z3EgN(2gi$|_a%<>7`6gz&=aH0-GR{i-}ZIoA3pr4piH- zl0wks>Zuy-;?C6G$A_xrA{lzhR+02l=nW2ifbS5#1fBF;g3@S7k>|iB$Fx51Dcl+- zIs#q_xsH&{cXGtWlnkVvO~QJZBT|i zqCF?=38*xkmwzntllO4Rlg*sr1GdrQFy=;dyJ$2#+|VZy3JDi9ep{zb64oD}P!(s_ zC=|&cYMDcDr^N7+sy?6il5Zk*1C*d|x(Bk01hG+Cs+ZGEqUjA}!l4Rx83n51cg9Bj zF_e{xYFkK@5sF7C(bhbA8Y=qy9|cPFL-s*C9maEAx0`zu#^QSuE~Jq9`n%U}pAV6I zBihN76dbJYZo{QNDlUk;@J}QrPvtBUPt_vD5u=^{T8>a5!;x--UrVtdVroRX4hrJ_ z1})n8E9&DhnX)ws{TDNd)Bmlg#7GRX?GmKk+F?>{bz8Xn6kg>===^hu&V zQ6ea{(~GPuCYa3?#A>*?pP^jwd~}h{M`c^SdI}sY6!|LI{gQ~ooAflD=gEV?4qjqq z(vB~fb_9_^P%QEsSBO1n`o!2s{Z`-Z;LD@~%n(Q(<)SMt86}3jo?s}@8M^|d$rw`= z&WZ0=8D20OXwTttPfBs>20=Sdk71Y0fE5`B$7b;@Jj0o0ngRR!^{ZqwPfr&lN?2&^ zDElzDxJQmfu)Qwmzr|$x)*Pm8{2?3ljnc@ns+W(r+7j9W#m4a96^}I-OO)e}X|l$Z zhUzzXeEWR!59lxE`1O?8JAELp<>-ai@*u>2eZO3=F9VZ&kxS%aN~>H9kfR{k4eG5| z+tZGlf;c{eI+QRGM#@jl)9G0@^0N?E>1LtUn|Ky#eG9W-+Ugpm-)nh4LrdzaKP0wo z00a_Yx&8nh=J*!(`9DE((NC|J%n=5&L~p3iCAI6QNSAIfaRiSMf8$yCOA%|>LudqJE(GX_cbx6FH}@qM*+F0kO5!_-w(1h z8%(psb~-;f&p%}4_T8PGFSp_U-~DoX_tD_N{lV^o?OURy?(gp0z594KNG&YoQ4mFz zj!n`-N82;t_vTEbghg(d*2mOdBr2X$kk>_)&k5fOb5!8WDJ-K(069&cQ9Y@Opc>TI z6YT?rf{UCVx}Tw8LbMU62ZC}Tv|Ui_)UQS8JlBpl!-Zx?m;eP|N^prn-^r!m;N98R z3fezIa-O216cz!eWdy=x*;Xx9>pH@^Y5uFtwDkt06;F;)EBu2cg;MwRd^ug@lS~gN zzWSCwnUg3vFXgM&KS5308}abaQAQ%&6?nOMT=1m8qnq(1guq*64PjQF-F3yJKg^xcJ=S4ZGh z+H4<5ziA9@X{LRnaRk|fKwl7@w8%-$p|%+yk_STpDsJv&2>i0r=go#$U(;pX($yX# zC8WdDUeWiOQhm)RWD0HH$ULpx5T7%dH|_yVq~8qKo7K~3UGVeR+}nR<9wTQs(x`ok zf$^@RYQe4k4F;evYgL?{qL`>Au%0-%qI2#)mN_&d{<%n`+?f$gDN;lF`O+P-ee?EU zQqn+eSa7GNS=1Q%M?3h)k>xaBC>j=X_ygGV#f;;nkQ3)c z8?4}*p|NUSFw<(cG>DG{3PliRS8ev*o>H&_B29=_HyXfOrP2But8OJ@Ik$=Y&95-#LexQJGJJY1U@gPyXzxjv{4Ec0DT zjZB}awn;!Y8vxTuG7{c|sS8Q-+=K^_AJ?_p+UT0Rz+jPY=a=l6u*l{UbWZSb08tzt zp)d!>|B(Np?vEdUd_$NDrFv3540bCH;*h@%!>309M^uX%sJwg#lfF#HwN@z~p~F5D z`0{)*8)sziBd}vkK9Wkv5C{tS2+yKKZt6*F_B5~bXJb3$Q4?Oe&(Js{sg5w^i?Ym* z$6}11vvs(m1+K2>vKEin_E++l{>!Vqe|zUPYtQJ{Iqe+$x&3vU{9`uwMnR`Qgyd<5 zpn)Mp_$8Y#0dT@n+Aa8n=0km3kgBYzCG!Xk?3j8n&lgBZP)23|`S%zgi{f38aL^td zxfl67JB6*v`k|Ba;yngj!+gVu!Wwxq=->}`js~)geLt)9)4m>A7gq*lSo8ES28tk~vwEG%@% zaaHz^59(8naC`mTxBtm|7CEN8>G(MbvofYI9zB*4r=gzMG(T~ICRNT<_6no%#OJum z*kIO9AGxyE^1<63C&2r$dg$)Mq|F;0ce5~TM?O9xcR`vPtNau=gmtZ(cI?->!dV-g z4#hvs_$|t^i-PkghX*AEE>2Gi5!CW21>d4c8RJY~e@wI{_!~7f zg6qkRWB_qd|76JpZ~hghZN}qQHZ5#}w=(BSRVJR_Fe+q2xQqHAU8A<*T6m&XUhVF3 zch|dI@V$7F{~H7bX~DPvApEFbp&LNmss!4+(YH_`37XE>Am9~Td&b;#`SLj%BiZ&V z@fsn#LDh@$NVaRoDl+UcZ^k)jP`OGB@X!Z`@w2WW>G0xplAXcMZgMAL3OQPT@WrlZ z_%I}lN;`uKhf;8;=5_nAwh<#Cg4Zb;Q-d0rOND8#d%0u zl<&~h2+N?et&60=lEDKBvNm8L3kNmqpTE%49 zli7kj#Ys~o!wPu^Z#{hY;BIKdyVv$u_*69=#}{ksw|4J7d=wnbb$z}T?CHo&H)Q$r ziEN}V4#1MuRWnKkuLO6{Yq%=ja{WdoC|W@B_QGsOSXI)7|5q;1t7V+w0=2o+u&s6y zVKcQ#7@I4CPGN)yiVCh2D_vbo zu^F4K#)ND_3bhl&>c!kinyIw0vW|Az(8FXbMCA)8XwA@BZ0Tx9Z78C zTPVRUwnQ-z^eOY@RKBKsETIlzBP(%?jrW_XE?$uanvhClwyT%j#Fg0pR|WqO;N&;U zvt;+)z5Dlo7S+@)s;aq|7jS6BPqx83hbt`R?_tkTatL(p%~0q|=lM9$Qnd&xiwTF1 z_idj9MZe9G2IlYgz$OkcI3Rqu=scaeOp$Qx zC&dU4{)o~BQP3M&s#$-{@96N8+j~&SAy^mrP&95tQVxEv_Wr>5olXbl1rTjal93QF zXTc~tV}aC(1te6b>z=ELNc2)gq?>N%Rr}dHuf$qb?t`%VLSw~artUaKEbUmei#(~Z za8dOwa9uG7T$O2=ska&IbZyYA2@5c}T8m00Zif;zlN5`AQx3p|bGKah=Rg?@&ouiN z1H+qW^ftmvns>!8c?~m@qDFl8?qK&WzvO2?nhON)asnR%r+U*x2{(9I@)rIrn->YG zYbF5>qP1Fj{7Qt!nmt4n^f)=S>>Nr^IXe6`ea1m19T&u@)kcU6-8iVAK`!;!I_B`& zG{G!+XV>_1ZLVG$Cl5B>VtBEW?*Ne5bed06_S9qqKX2o%BqL)=C~UXb>*Oz%+J zi!+FEghr3^Gk#p5^58sKZkM!O4yTf-!g!VUo`op&`=*j%x-IU9f%i~FoQHpOVEg!+?9Sr&D73WR7 zf~|X&T_MB1xPl{)b-!RNLisl3Q$!yU4DuDD17B%^zN`1y_Dwg7(6Ae7V!_fS2LrYW&n$pYjs4hu=vXk%O9 z7q$CSuCWdt+G-&E0i#F-hehc6VPdF36niyARmG1#yhN!5m>RUXyhjjQWKT(D*HpsQ z_-W69f4ONx!~9$%MaiFuJmlcs;I0ASXo7YBT~k`m2n9I7v%wdZ&>P<}c zBcUs;+dg0`b^_V#@lU@{L{Xdzn%Jhp6!m1SIohWf17$^XbqD{%AG~;+VM1NbM>#q* zc72?^R6+*}J%T{cDuJsQU!o?AIVxd7NQ))ir}R|c(>Hcu_9gJ$|qYkjhDfE`#22OAYgkbm*{6{>{qE$C#0=y<)&#aX#oxKXZYSa567msfJu$(X#O?TenISDOIs*m)iiRl3o*s z0H3J+c=g7wp61XUnSbq0w1CtbzF8yDFzK|9$4gA#aztDI37vo9CMT&P+$<@yb zxL%f1dU!IoCXg@S$|KAQYmF8D`=!07x_wEk2T z#}PYow!2QiTV=W@^6_Vepl3ji<9y2gw(E0b zQ*MdmRP|zt3tflj+hKN$XmS8#WP^vRWN3vX&?O*2n2|I{IOjBnzCWka*JRX(f0v>~ zjsy~$Wi1NSFU)sGz60W+Z;1{9HES{0miWMoixZ)zc-wwkoP3XhYtR0qm-6Q?Ko3qF z4>LtDK9uR{<(#ib6dDgmhCEM847S_8HMqkV(1s!le1pJ20 zhY#-cl3R~?Y^9^4($SSe&+QJfTG@>DyKyM$hSuWv*|r6fUD>1>Ao*T-xxDBTXW z`XrB{hXx6`DDPffUu~>2l1f{l&Z(Eny1)Az2g?+U~3k=wPTd zZiDS#%VIjiKz7c;lw==M^p@*Vy?48!_ri)9X?sX7;D7z(o98cH|L`0xEs6!>nBN5= zO`t9?6npaG?eia)Cy99i=*56in{f6JjxyZcODQf7Io@Lrc#gmoGhXLO{YeIO`EZ#uVjcXl2>>h7_36MB!K8}c}xvb2?b0P;bKd%QiEmW{`% zrE1^VZlmWPjJgBe68Hw72=^ZKkd{o)Y=u}&yjc-HjK++%9mdkd%L7%Gtm{yhIRa5o z>PZfxl=v|HAYiF!P#ci*hvgXMbrw%8AD_*ImR!%kEZ?d!K z%3)ES6s0YH`JgcwNTG!2Mb$;gJy|+Cltd2S;GSp`+Vp&R0<^mApO0yGdy%IbyZSzMZe`_gJNxT(ke^d4GN)0BwuPHkTT#gIM zI_lQ1iYpy-BQpM=fq8+>_bBEV?GZPUdMEG;%avxuLwC!=d~53{5~E1D9HnI4yVJ3Vf0Zmi-G_X?{_IcBXvJYzu(ojYTEPA!>IX#D@uB>#rfWbZ14u>Y$aCk#a^TJ8&i0sM`u4rjH*z`qJHqQ1^4T!$FnvGXxnc=Pm#M z>*LKNjpFwFNy=8#}Fpi)l>BNTgYV(?@q-YNNJx=@h@b| z4Ei-8cA7hgufGo9uUfHuA{QYP>e1hts2S&(#a>rxr$@DEKUuk*FK&C2OH~;gI0jKx z8wv>dfmO@_w@ZLKav^{(}b}+DsBs&(nu|^QnH9z zZCw$m*v#L*e)F~+4gVrz_hvJY!Qo{dzZcxegk@=2a^6#~wu<&Ip2ZHG8<_YZZ9nJt z+{TWy6WAdfIGL9Y`-feW+kblgwyltdn)Zt2M;^z}Hj=SMm^E%O8Mp1>Q09USh3MPr zEUdaC(K*;dy1c=8(3eE_2v=rGBA_J9v~}IEg8ShJFy}<`gZ=5)F-Q)Kry{UXdyd8> z^YrVn2;(6xY+1+-GFnb1m&qvqpp|I~1WoE|PRbyz-TofqC7JtvmQA7l+kzSFEW(}k zS5V#8Z4I94I7f#v!w9kpW9Rtd2f9P@AM6^5zn{u9=-WE){no3Uk;5eGQb z>~N4cs?!PAhW{2E8>r#iv|RLGA?-)6V^*F^E@A>=zyoVH!59i_*&z!;*&;m~iU!WJ zWSmcgW~HM1m)Rkb&j=Ox63WGTb1_ePT@K?MQFP}Slxcp(F z`b*xLu%Iw{{AYWHJ_me%;?1Rx!>#&}9!4`Yf%8kHK58M<(N{|0BPsT4`XS|u3XwqB zX;T(LJ4vlzecP@p)QfG`09CqebtrXzK`vvyrnbKN+pBNee$4(t2%SOu6&`khyd$Fp zTR|@2mPU*QyqwEoiNRkTG$N|T8x_E!j4NT!vl?spTtrrr()V@PMVGTt^{DwF}W3K2rh4O^8(jm8+eGCm+D55s?iGu2BX{n%P z8j?z$qb~?CAe0{m`C^=EbS!nMFa921gxo*GF8uE|ufMapzQ-q45iCde^dq(Gzl8Pi ztMGz?E%|;W&YH7N5q48WuoQeROnP)8UX$<}KEIf%HA!pYfT`0~fEPr5lfER)G{REX zo8#h9o53o@f@?PxOl1cW!Bc{>A@*iX<>d2NJ*C!J2!XwHI?hIjiC3!Qk~$8cR-1)B z`iwRfVTwg=PA*GWDPEKVW%fm8&F#|cF<^pvzj-;@X!tS$3pWv6n}~D3>C*$<2H&6< zBN@x$0bv0z{5L5An*6xBQR73~yYwlwbof{v0Rt>H|(2dKGk zi(+OnBqa=QI^B4fUt}t;-2R7>`zp(ZHi_B zV__?mXkuf@{f55TNpKPcmT;^d7RvuU$GV#OKnPBi`a|+ICjjU>amnmP$vJCPB$cF` zG!`A}v+NWk?Ti3_H%9VDm}h<6=^CCg3VqLN1#QARZSs(rWRqfk*|r6FLy~NtL;O%4 z(oRYsExvtH}1>wG{ z{w?f1mb57;r*=QAv#XO*n2ye<_rW@%x|n7vjnDhLrIOp ziI1s!Up>JI=hl#yW^JU_(2y;I5My>DrSciz8d^Byt{?6mRm|Tgrt>QdI)L} zwfrR6>9ib97KdA3VvSBa>r8IOLXaEf16WV^r$TtW3k2h}6xF2C%hFW(wra%oycMP(lp$;w zzFYj7E^1a=$A1l|(T=OK8}C7~GoY2JUZOrk{I4ZX5(V?f@eTSLeGDf#CVUf9y6MW3 z{iMn|3}73PI{?o+D-w~Ppue$y;Vt_?>pKJ-bg7)s2b=tCgBNV))|U_N?G9PMWQvJh zD^#zr&54Q41yw?BE%#RE)`Le69}bh3&%XrDu3QS{j+XCJ3^)iGrBo)))~MsUWC@4; zajJ4LyYbx{BIPOb5{S>qrNH^XF)_JEYDJUXxGc;(ffbW@fbf!(Z|wujga{VpfQ25! z#KB*Xeh7tD*@R2xR*rndvO}YC+MZ%^fN7U?zvu<0~I@;F!Nz*slr9~CEB0p zR-oWOMraMypsBH##knFIqyx1hVJm(BKT-CR1Qh~R-2nn>B%)SG%lDM2r4{K8NaW+M zwBJ7wzs>IN$Yw~sD;bMrKlhcmm`O4gZEeMwc)jpz@hHy387;_NE{QjLV`VKh0PV3xL7Vg&LhmY~onCQq0 z5x>JVi+7w18Cede>4PeWRqz76-T_nqw=bE^Y|whi0|{st95bQ;q?s|-0;#+G%k98F zFsfM;o*gFDu>qK`wf)8JFBCi-BA^I5WEfg>?zf{6TPGOGTwQU)f^B{7Dz)p42e(5# zB9d{ow*S{{eM(xJW8{LFk`asCpySJdd*fqMg_d~3@?jW3@aq)bwjzIbl6I||?cVj3 z+MuIOpeg&a8xKDSh(G*)E)y&%Q&8}*;y%}W_c#jb>0&^G6KJh{p(vRdx0HnbG5Aet9iN7xW(Rm znE2N_N9e672Yq#kt)!FGY9)T;|7-7CyW2LBL_bTv0^($2(&9ssoy0?m(fT1LnmD#6 zb~c$SX?#Euln_${Ly(pfQ~TR*J-e#`P}0ooo^$V>&F)wP(9i1X>gswvq|8xG3LNO% ze_;RgqTl-%khP|s#ob~jWNEuejFT`;F3OsUAbCYLRY;JMd20JSln$<2o3!c6a>SsJ z|H1s(ssoi`9h9N4UYb0d;yJKL#K3sO8YD271g(o$c5dIa@zP(Cg*TmfmbgJXj0?FP z?`*+BUEv$?TIwmP3v*FqjpX_r%#mJ^Hy*{ooMcnZ{Km54iKc2F3qySny_5mQcn6#6^@ew` zsjB}c?GZ)#TrRR!u-;oGkq1jLS}?KN>&&|YN|+!kAX4Kx6}AUaZV7=b+v;enWiXYl zmX$c(z1ds4HPxaIQ7s_esAypIn>q2x=!a>8YU{kcYN)T{=vLB1y(~ty7+8~vHFaHS znhtChDsj%+@EVU@uHi*WIccRsacq-!gtWv)CXsXA+Yo=EY!;tkqu#X;_+ggmn0>YB zL|YZINx#yGVb|Va7K&@!gyg;Gf_Cs+1Nk7ANUTK5-Vs%diF=4{?HEp8Oj|I?51HO=XW-6Z8w=0h(@AL>|~L_2&>-(i&vU z_pjISn5egoJLPQwbFGaiH3wYTHVr!L`A#tSu+u5C`ja9*`!v7-x;l=Xf))$f7K(&J zc>$~|kTvpr^?ROD&d@1v7S9Km5;;_^Ld7~zkqeAIjdq2XL}TgPW^yA!IBTfg*xU%| zSzzVvbt+zGuwIcZs+qo9@i2%t@*JN2tf5IFex?Wu(PIoO@9KX?^<@-z`a5VlWHamQ z4ZeXOv3OE7Q0PtOjzLp5TmvA-l6SrzqLw3 zbgX*HC6n3?=sB-Yhx{HKDfBC+^Kr^Cz@lvODfuN`oL5{+jy)@o8%82<{0NucG>j8o z+iu{G!maX>o)&5T?aF5hGt|@8jm}ne4%UpPaFqU2{Imz>LFib5H(BF#!g%86+6-#y zUhJ-$xcai-V@XemW4=FdT@t;2;R0b?Ybq`gM&XEfFZUMm;~BDJh2NfAz%#c3vA7AD zcB@D{o4Gqfz$_Ou0HprLq(5XVUors=y*LYQC>Ruziy6l{?_X0B1AK4n3Kh_9yVOhQ znR7>9MK_)rS%+&3F^Y}yP~e*z_6Ti`*#lUwK;6ygVbqE!9Cyr)V{E|x>#t(WjKNc~ zISP;_*IXFg(Q@N6=TwpPi)56NY4spkTw=(Sz&M2@AXnnduaz3yriOfXf;k)pNv(85 zn;3j1@M69nN2qSifW-OYg~q^$&}f&;2K+1a4^kfqZ`L?vTUe`(HNvarX3-~tzK5^G z;q+x%31sz{UPv5_LUYD@x>zDF2tdM`$5{MS%$1~q`lqpU#7Al*Z2<}_!e~HfsU0k% zm<5Ptag%N3y#Kz)^7;R|P89?TL%J#gB`lnjcVlA! zm#U9OdL7OPmI<9A(y>v^2fnnVwp6zM?^*v-e*UksQF|HvSfv4am?OmEd-@>84v{1h<$4skwqXq(VVk*piK*v zk3_Ok7(n=pA^dFPy@Ff#m=d(aX0610Ml99bt`wydT8UW2n>g9beaO`{gj5f8J2*pO z!Vf5uFNL^Zxn&uB3vJ3ybSXMK1qutE^0CE9E%9D1xRjHsmg8O-gES65gQ4*x_=%rd za6VMue)K%RF7}$5X{kxia0Xn=IezZSbhF*@XBq;!JL^WUSp1h zDYILDs7MTj276d0pDOm?rnkCK{CLT6u`s!;n1O9t{nbmGILgRZ?AN*x-x)I_6U0HB z91M)m$dbS@K?@$7{0Oa*^D?>Fb@-!Zn$u6LgfY$O5n%Q|{;n{a4v7RcRyfzxa0b(G zpvfOcqg!CW6&DZ-K2DN(Oo|QKReT-S_-dMQqOOTJ?NV%Sr>BjcaSwWrI_n3h*MN1w z5c-r%Ig|7@oXFEfyyDQjc<8$GP|9qX^V2c-JQcTaw9J4SRqe5NWI7&GGDW;hOUsS` zQdR8+jx6`ALkJ~Y$w#D3DXB~y(CIUQy&u_?pth7;YkNf2ZK>MB@OvQqz;rH56Ppy{ zheC6t_F6#wx_f}fr@hEg5Qk23E9a)UP_|smmYA>A!v+2W0w8nQGf`^g4lgX&#mrl9 zm4M}XAs9$JMjZ_i16Ej){l#pl{oV;h>J`baw^l3c5do(!sH1jliUF5HDYzqJfbid! z>8E%?((1q+x7Ywj*RqE8YX;9i)-{#>OuUs8x}CGwG{yU#+#RfXn*XzMwu%l2Wh+MH z_Nv08=RX=MJL6C_X{*&lOJcX2zVwZsf#)MOHk=eRG_LltNv6zh#8F+%_NErv4Uf;_? ze&^C=;CW&st18tHNm4w~&$M8Q!y>A^F?mN+azvVf2f2%&MqF3y)ZiANPPbooA{iS; zB{vbetmRtqTI#;JV01UWma$aU(i#T}18(%_jYzs|13If`DT=TeDHib=-0JY2=WG_L z0-aXQCU?&nN1^F=zIHyF5+#vQ2$u-;Sdj@hOV2J_TfK(Q zwFX|&;H3$x%ReMAZO;hgK1)2OFfG}Kf>@09ufS<-xLbvbM%Uy=F;P%ujHkVD5>SEX z9CySB|GA#TBVor*TT;b~wi66^XN^y-%L(fsCBZdPfdNutJ!_?bY$|c(+%qXyiNZ+e z{eB3bG-rbwe`<&%pI?(|gWEEyT6o*Rj*`(z1;!n<-Ypew6!<9FgX|)Uk=)6B>gZ5P z{3A1AH$dOC$fC%KjjCDhOB&+zzOPAa?+=sGM@jGd{5+kEw61lF@|_0y`eM%x+loVV zHWzxhi>;3v?v`B{8Kq)#9aYUue`2ih*ShgY^gNvdwo^KUqrE8@Or-Enj~{*Wq=5+uXLGd#)YdR4HS3GW>)Yni@{!FjxCfAkAMqm#=ofQzgAr3< z+~aNL<(`q*nnIb4M%pCuAn>ccf_=@34rK}+v&N-O$jDR=LfFk+8l__9Sk04{O-A04 zUXn!3DY|`xSq%D(lY{y}|I5`Ejn&D)$w7ySvARfeLG^*EJfo>d7agX#7u4j?JMFeK zO_D$O&{uYZ?O8UfOS&STh!R#ZBO~IPw>Ne&8q z;b_9p4;-fmO|*#Y^6SlHC=?A}#^&p@u&(K2k%ZJ3?gP8ef*@ibyqQNY82*u)(-#IUhTc6l*L=2Pl%T zR>|z8F)z?Sn;nN%>}m}}HNhxn?30*~;Z*7pQO9|n4e>5FV%kKe3U)>PDn0j`pdyZ3 zv5+iS;dNb1feWvV#VOu1jgK$;WFWXGpO=^+h2T+dsAK<%t5kZ~n)h!Mn4rNQ;AKaRzhO>P$-@NH){U`{wg@}PJA87&zLz|TorVH_Pi7=S$ z^%rm9tT-T55MnTp=$H1Xx9JzMhBv!<2rRt5p^q0HrJPozX01*Of@IgUyWcwp-!VnV zp;;M$LK)*lbGptvd6WIUip>H&pi27{zpovB*!pdfMUsIM3$?$q^@WFxI{LJXGsMS;Lw)peio22I?l#RiW|Qa zliTn#roj2-4Q&dC5jp|(kiSA zQ9Fz@WqbiA$(bawc093cM7?AM{MOa^+`+GjPm;ErtbpP1Xe62xbXEIm@5xRVwjE&c z6waB$tJwsQbk6pzA2A3VVEHtW*ss8#d{Uj~C__Zy2sQw0PJBikyqW$?59)#-0sNkl z>Bz5~=rM?P>*Aks4O~$5nK90qIJb|L37m|YwKiiRcyT%Yy>BxOPSLbc+uL5Di;+87=4Qlk8l9Qt5?bgOCnBI z;2OCf2?bS~kd76si2dhq@SdF)7D!p;tx!Vf#C{=6Rc2%_bwL(wKFx|EzjO7>aj{nd zbqHQb*r#5?k#PqsTWdzCm{M-=j(3ah>c5$ZMFCt?J|+wI{%uTI!Z==qMh|XAXUP;b z0TeQHk^#FB!6hBoG9a1I(mY0a%agCaY8b&Au$Get8c37RMS+$ z-x{rWod)Kv_DsASH$~A(v6rG)_yy(yW(v@LV1S1I1&)(d1#ndCf7iDq=v7I)3 zsAQwh)LNvx6ro~5wvzEYac#vPQPG_fBb>?3*G$*as zgp1WUyNVuhGgi52P`=;?r&w0$D_r&zwy5veqWPQ|BRBjPD6bIH)9IWili7GVX@8t%1E2@U9AK=l4kyo^ozFUG1D{O+Y#;cv zOGY1%vxFV|0mXsc4?9;+c6J``?C$P*8GVBgE6|i)`-Op;3yfUSQHe^t?)ctGh^hTd{THF3|iDcC*gHX z`nComH=F*KozaozGnxjPpMv%+=+k@SFHqw`JGFS$+2PwY*^)J}Q@|p|Q@=dmLWDst z3Mj-pH9kwU`@N%4Sj`7a#bT9#K|Ql2GyVlPmJl=ChJ$n(146SK!_nc_tv~aPzns7| zXoiF;*LWjLE@lh0rOLgF139nM|FpaNc<<{*0hS`%XONoW{fa19MM$+J%yF@D0P$d` z1&VZAPFh>d_~4Le3UyG|)f|Vf7g*wK6dcz4S{4Uf$Wj}uS7H=GB*gzE8GPgJy!6%;=!g1CT1o5{2?g$uu^gC}c^{5b|H6Ozf1^>d1)-NE?(Fkx?8C`8YKf z?X4<1k`S)emxJ;0fLxZl(c_)Ry%17|Q7ih>?&Gg^x^UIGNYGzBcfK~edwY+Z#DP;V zAOpEap$#39R64m*)is0L3r1lnXW@rKz%lQYr?ec0Zkw3)*Q(Mtd?G81tFW%63Y$HD zoRb9CT{MfNc#U^@(6urym3&HxpD8ngN-dRdmfM@_ian6og9R^M_!WJ{$!#E=hk|XX z`ma;jnjky zF=js17hXA;`_c9`36cY|+}n=&P~<3#2MSk>X1nN5;cDV+SqRAyOxdJG40%Eft&#=P zf5C_F*wujdESQWiJusU&lqXa|V~xlL@TKAVtW)9SHY+G^g;Wz**(7t1QwGf|*&fn_?-Hd%x zkSIXY-P*Qo@7}e2*S2ljxNF!>U3B4obDsy;=(Gf z!hcAodSWMU?KQWjuy6#b@kEj`Cp)&bw^WI@RO|KS*5SN%PLAGPMHj?QPT0%(nIQ`E_|0;>#YJkNK)8-YA!er9;#!9aCJKRwWCKGtgABn;z+G$+|4l>> z8wX-g0hwFXoi_&wCCec6np*2P&^pf0$lzP-IPFG1xk!=Nm_+DLaZo?)XwzdmB#ARd zLnzKG)?J;`oQ_|&kD!pM3LBjxWI_xPHkQjZDM$Or?2WNROJ8b`gwak6O)`ww%A8Om zT}0Hek+c9dqd54gq2;Zq>I}`U*JK@`54<^8rC&o%Gy;~Jww8g#mQ@(uzlk%Vtlc-i z)`!?soG)%Rphh#J-F31!iu1~5tdG&w7_xH)_;Q4^TJYd6b=2^ zkn#|vo}53^<0h`uio67k(0F?(q%4RsGXM#;`R&CQ?QQlH*X zdKX33;F&{`leZlLY#49Re-0V9d?^*-4lBrdC~84e#Ck0nbxN~sz`ME8&djG5u!sQ z+#)yV*oRv#2nV45nIqGX3HnE19Bg^#=US=|!(F9^Xq@UD**g~IO1?i=pdn#ipbb@q{PIo0}DQTbWIV1cS1P~MWj2>`X&sy));tiQJkl= zS{*J`g>W|IE;ag0e7XOC>URA&U+CL-Uk*YRNnv2F28!STEHm$VLlr_BSRU5dm z67MXxaxX68R_H#_5>9X+)d%O2sd|H%fW1k;tntd5SB3e`E0n034qi{XkPx}Qlo_F> zqHK`U0rVy4L!Qza;wgB_rOn=pL}Tsgc{39m(Xsn&iVhMC)T3)|`_fCeGmPwe^NL;{1{`#kjgIBuBfIWlx>{bh6D^ zZ*PFIDq>5cjvfezgZrNI{b`7v#XFkP9zL2G_-*}PnLI5)P^Udf&7dd%cRfOf)`lF! zfYAD^ef8#1IA~;=OF8mQ!j|anlr?_WmttyH#N;iY4Y7H$^ml_k+ie9gSXqn?t8u1b~G3vXJ zV0#3xt7h81lvvMdqz1gD$RXOz1XBx%fG{r%0`tu@v5G9VP9^i1_;ic?tulbe+O=%HZR2PWalUYD~Uv;xYLab}0`@>YlSq zL18p=FNb5^i+aNk;7j%ar+HG0Q}A)Ng=4$kAfng$K%s34=!-nj4kdWqd($IQXwX5u zqFxx)U0Xo?Bt$ZoPRehJKrcTFrDDvif=_8bmOvonNDKul@%*^G9R2KqQ940S>Mgj) znX|=hUuMSKaEV59TIo|7Q*k~j9A3o}%3iiG-j++3=nW`1*PQ8-J7=C&H>=d=Gak_V zQ${YWrE>ZbJfw_u_>^AHb{55ib5uyEpcML;^mLL`a08O~f9viI207z-HORm@lay~o z$QJj)r$y{N9282C!d$V?P#PGY-GfG|x}!2y_v#Q@Z~bYVGn8 z5+lh9@MiV!!kxe6Bqh{^vhF#u#L~S`i|iVgQWTTY#noU^DM#|T_9EumkpQ;AKf39R zLz$FLfvJDWk%R)m*^pAjRi4W9y`TrL%gBe__>wKX;d&&t= z)CFo7c)p~3q5HIK7PGR{Mm2?DwAQqeuO}8JS8?k)wOJ*YV!yHK#Ei}Ht*IB2&HsI* z$rfJg-w=z0qt^!cyp~It)-}rlUzJ(!?aqj1*E8Mu{i|U(Cu!!^6 z>(T5EwYVjOGxMivtc69~4ZCw<%}EEJx5BLQzt4Yqz7Ib{K5C&mXEFd?Vo|h6M2*)T zr2(l|18sfnqRK%Ht-qF=u+x%NOi-fYpf)_9_KYj@100kwVfo6*t!397>8e1u7<~pk zf94+)pVU;E?DU63rAfj(O9jKMcEOd*@##k zhF@NA(!;bYF{PBzs*}B=(8+ZW%uxWc1j62sA}3vO3jiNXlU_q}9uHIa7$gV3!_C#! z+`oA!9h9^9g5~iBVwES&ke;58%qGCgXh|@}$tGYRx64UU-?I<));Sq^AN~c|yx_*A z;gF!g&;J{8_!>&bjJqBQZBYqV)x-BX{d zLv^bEp=Jo(H$v-KDtssF*zL*5K=+b4OJ?4D9!rWT#dnl`x)=kM9TrfIzj_y#9YM<; z%?vsoEG(gakmC5$t*)pA_As=j#MyK^&aXee!U}h|mY^=m+ zKV)n!?BCh5)5We(U1zx-c-VAm0od>gYuuztUtC}W?*Q0bBbTqpkT^rqFWLOot?v)3 z+4OY!-lwzUUHJKY8xS|>957gmd-d(#|05|dSjNPsw* z6j5YC@}63*V>*h{y;O19(?sP(U;fu5amK%#-AtxI(IcK(%E@N=Zmako;cl%U)$lxz zNs4pu);h5+A^SF+Jql z>vzS^sYc_Q#%k-g@Yd#Y^Wy@Ja4eW2=s@tgpE9vO@wT8Pye;q zJIkjGN#*0(^k~huLZF>s6=JX6`!S`K?^3Z;6hjP4pqAvrf|(?PDFUrufl+?+R4s?dU1Gw~K&4YlNCcmGK-c$tQ5JOpRT zc_Y<0=pZWJcL-bFLf2;SNJUyRnrJ!d+`iSG&5yVP>taMB|49|V4B^t6rZ(g}GoJK! zClh4gdsD=|nT8xlUHPk63hbMc?*#Ak5(~i=WU?{-u^P|R|Hh=$RA#UY%hE?MCB3rd z4K{VSQ5mu#IYD-Sr9K^D9tDjQ$GC>dS0r43Epw;2^(a(>xovLnJ~D2ws&EEViV@vd zWVD?dB?T*Ago?RIbbw#pWvx>KDAp}z0?2R)E>F=qHRq(Z@fcwW(g=FVpbxnf(OzX{ z(v7AV?#vnyPDY?@%qdVvPJkT*)C}c1Rw(juRGRBoEI=ctQu=PF{KRuja!ckka<9pH zlq^Pj$g8+>Px@xpC#~(JY9>U2|7}#qxfL#R^qKTAC8aeKMLwyu>3eXBsO1>|pe3fN zHt1K^cDK)_1TU>}8q0?)ay6ci;)Y86HMpu~RDhQKdEDJMcVb*Qc=%^g-Gk_HY2 zGF`BK4Hr+}DW|~F9w^U7b!T!mtXxJ!!%z$KwB^oiVF!FZ7McU-$;K9GVwVM525y)@ zRD4EyH_H#FDA(_h%FPM#4+|*L6Yihcjo1uMji4w%M73d`V|oRi@F}*TQy9ri2Pmq( z9z{}aS0vXIC{`Q+F+cuohecE(cCpscr?_2g&nb~5H+(u;^1qIf&5%K$!}xRtf4+X` z@7M5AF~BHjD4C-41)3zDUEIFriGL5u=HQdJ)hU@Q6p;t4R8Ge71!W4O z{`!G9CBE<@gQ*A0FIh~Q&AF``?M{stEQA;+R!6{@$F(gnqK!^ew4Y|JQFXWZ*zwdu zkXeUhWS39sZ608#P+ugMw2dxHDbpRC9Flrgx#G~r9zgi~i(8|?E2fFtgoJ-@rqWPC z^+#(JYqC@TM{^q4s(PA4CMZ=)IwC6+UMx%<<<0vl<-cfv%ZqTfxduplND&`bF=(OZ zV{CLvPGygGY8A7iYBMSi!VNFrun*@T3UkPM%^5n$l z&FD%^{{(Fn7$XZDmhT1D5<3RFi__BvR;Cj#b)#aj85&<)hBIA=Ds#{|F6vTkyT)YB zXSnF_%K*30ZJ_PY*6z3vkv7yc4-Nvgjd1bBi3*7q`AM=2GBLrqBFgwm0yiPX4=P5` znmpUO%`*+m32K4iUqPL-byUgxB8DmtRq8$~2nND#3}_^jOJRnZvcj}8~Qb}_bU8R#fewXu!GPEaVm zwVe&hkfv4Y6ylVS)$3N=55{j(0k^~J%&xy#@7m?7(XYZMUr>szkTOLuyWRlm$?d;6 zP}P|@qiyp&RNE&dSOo5i2ODwO4Vg805Eiz^;$uR`zSGPR4kyY_l# zDj1k-gt%IZdv;2IY3%@sO&#eASc zLTo4X6G9;b0c;CIKthxeX|#6@GCZ9HX9ELoK}Ybjm$CoPM#+bc-csM7k*DFV)vr5P znNe-Sak0OM@Kr{T#-lC`HURr0m0|l=a*#?81vfsT@xMlpd&y7y)I#NC1M|#XTF|W-ZEqv9P?9?>>uk?8N@yHZSOQ z&@v?$AAS@2+FCtR`*WeIq968q$mvkTO6N)EEl)C3S55TB3dMjddLuVHkQkS@z&3>s zLkJJg^6Y%khG(t{1jYPwVbra`RHtpJQHb>1q#~+>Qz>O4#QIzM)V5d0HjpAZOXIZkq z+ReXKHY5#BQNW(~>MbuWbnECBQRP2j2958>~cZ zR#6n&%x94QyskqJmF7PNqs`sZz)2qs;BqNa4v-q2wmY0^ZW`Pi>n9JKggky+$p;c* zJ$r!4R~u^1&2Q!j|4Ov1^C{+QpLIxgXRH!=y4DMm{) zX?grPDTvc1lz56Ik03UmEw5kYs?J|1M+`%txlA^a>Na2DTYTwq>~9vdl%i5^VH%_B zm|NlEa$-NRv%9$xbAXZt6dkIf`?#BqK9A1cBYewT`uEXsMUIH8o0ysy@EvH;7AoXx zt#O~IHDz@U?`36KSxRsj{FZy->IT;!kWmDYZs3?bdA_H@yfiHHP`0nw^(U%?%p#yg zqmvO$R1QRjStg3T*@)HIp4zNlrV7ahN)~UemwfcsV>XJCU~hlxr=S_3aAPz&x(W5b zxF1`Zl)or6Ws%?MvvQLx5zDC+Dg<1H(?OCfZwcte-vPmHon{jROJ~|yhXeu4`mJ&z zlKXM8>2W5!L66CtaVxge7G`xs3X1YGUFj=FPxfAC_unBZLnlS04#O+^t*4zEaGXi% zyda}$L8<_nT+QqfJGv91w=|f}_*yvR5-jT6FuM}zQBG6FqiP7~)f$z*SpjA2V{+^M z)dlR_>5RY=afanYD6*YtpbSoHW-oWIDEkkw6l5Mrb~i_1ugo zuLl3cP}qGJApEu)OB2eo%K8np{_U*2;RJ4_)F_SLYP}tn-Pjft>LJ(yY*V+tuqDJ= zrJfx;S?&x!TZ5$pTa-DQR3ZG2tkb)N0+PPBR>)CV7ABl)rcT@cR*pq_!?uYA|N`IT9wh5|f&3YNuqM32?hTy(@{H?dnw)MY)i zdnmS)9n3j!kQz0SfjEv$1D*Q(9!nQCUNWCq^kg3#k~+0e3IxEew|%bM5aXV7oksd^ zv01fdJ4&x24jWv-x<(suliv|_d!_B{39z-2ph(&zpn=D{ojDIULi zs6O%@CrErv`saUHue>&1f#NcML^46lLkbzIb$gdt{tEbudZX#z8t2EgjKx&FYqd~T zuNKJyIR=vmoeczYZCbEZJ>#FEBjMhrho##&KgLmQgQK z==Cn*SK&qaw~ds#bhoCeS%&r_tyAga%X~&N`UR}P)W3EB|dQXF7~QeBhUsB!GNWTLp;Co9I?Wl!Ah!~iLVfi>s!21NfjD$IRGy?b7@)j)yr4e zF-GdaG{K*n-=Su}vtfmL!kjbJ#o9?4vdcKbKI!)frd z$5S8K?q7k10!LC)hQMy;0Nv$@euK{mrJIrDG^Cjx6TQpB0!{Sq-xV*bJ%DL$YfK-p ziBvG(wsurgrrVE3i3ga-g8Az;cvM`f$%G6kyS7dZkE!D8G$9xVo5@e%f;rPqwo;q4&ub8B<;lIwV-+R?nnE-y z7Egmqy+?`2PK1wI*H=0s>J4W~FO*1D3jqZ)8Rr5WXS%F>Qv)pvNtTyt<4O}2N?x6L zTrIZ$0-*`(!Ap(zWwFfPXqLl_&>|uA_B8hesg2No`i`y1{Z~^{${<-Ip(R$;^YoI> zp&lD?SdvzlyDEC&w5>C5>+eP7oNzUKP&n;pQ~oRJu1RZlfV)44>w^~vq83Pyc_5c? zw)UWzt|lm>iAQEYpUNlVrnaW8vj61r+?QEQgde2>UyEx+KSr$lz=l3)0V~cJ_J6_IhA3Xf&fMO6;`zMlSY1+_Vf8*nip7piw`2l^qEAp_ z3Ps4`Z#6kUL4TI~mBr)PyX@3;&7Os0fsUm02(81*imk#5#2K!`Z{qRtmH260vZIAH}w$zdzXeI_&Cy}+DGC}_=a%9FJPd|kc# zd{UW_v^*l*e)!bY;LFZw!|{(OxzvO_bXcM(M<2L)h-b7O(x85vAfs4Pz4KN2D1-M-$B#?=Ni4aUu6e50cf6+BYMu8t$WvY*Ha$1aR~U* z=G&3v*c(`j&`#bA4CE3o?RpmDuOmoF7xd6k7EtzK5du&W&h(*uAno3mCMR1bDf9d_ zM>}zOk`NChosuF(!V1S*M|VfKv2)|a%$Bu^*U5e*{}MRNAzsb$4pBIcj`i{qZ$jSn z7||mshZ+?^_cBNz7iO$jsQe@x8MV@O@lyGdILLX1DyPT-NFv>`rAHE+#E5{P{DiEbecYt1^G~C0;Tj^F*{X;lQ)CV; z>dh%3qehBu#Tg^uMEY(^hi6G;p=S1lTR#f?FwaHUkp7`U{F~rky5Nq?Hf^}zxXOBe z06QP-G2icz&2KPwVGKq8i4H4&aLJ}U5sHj=Np38mFu$-8JW@SlNIMo+{Zn*&(vuYK zvfF!_IYpL(*K|h|!vcupEW?wNx(fb2+S{v2w<2EBGu)qzG1P+-72Rvj7pzuZN}XhEsf2x$QgM3 zuxF@N>(S{LUU8eHM=baZ?RV*lVo&PKd_(S6{x zCanHC?Lk}3;-R+x(nNZXx#`|IyYPKS`Sl7L9PL~3zTejQx=Id=_UXRlTH>}I>8{h@ zQ|=g~KBdRW6+Rb=qN#9M^HoOqyh2MQiirNcaL@zfv42tZc2}S%oc4BiO*x69;~f~^ z>B!5<%g6I=?fKF8gUQhL@d;+>C437wnfw6RJ9`;XGPRRFgS8kKxl6m}Blm6nk zRt(urx?=vrVk4IfsOv-T>keJB&po1P!FPS8hmg`?o55Y2k#Vx|rG7)a%OYSkcau3O zTU?Rwc5bxJaY4I&>f$III=PGcltZZ}hM?}-P5<$x_`{K;x2ikebMgfmLgXo``G!+0 zgh;|G`(ChZ>^oSH^El()&`Z5Qyf=mUcv3c4avXTK`&Y|F_&_Jdlkc3*);nL8{&eR; z53t5POZU;Wbp*XOe5E#g#Is~^0=xGaJ@T*bAN(9lu-cT7$5CR^HGv;k z?gLSr^e6W7s1KpwYxRP^u+fOV!)-YA=L>3->of|KYqjsF>}(HL@?~C%9Y-D@ogidQMzKFdIlW-{IlwqGx_+Pn z$rhm}TxHihV;-Qj-c3K~+WD#w`vO0=uS=|rcAzH{y3x8>{i68-dm*^)TdiaM;5gYU z$ZC(nrUup;9op%FF*(oeitNs_v$Ngai^@{}s^0?Eo21wD805tmAYV;cc@?WNPQE00 zQ0q>`(b6CXG zS$+p@ZWh=7eFvwvy^f_Cs&A~Gfu}cck-~lEt zCthYSJ#JNZ+^)YpFl$hWWAB#nS)vJMWQ-AQ~jU)M#Z|>`L0W#}feX+P_-2Ss_^#+An&gc>#lO#>y#uI-4auL{mrmg1wAaVBK zq~MWN1^(m+5Oy1^-cpX|$#Om!g9%pQ1MF={Lq!9OL=5>bC08pVQ_5>#Ug3l<4A!gf zSS~K`LD|+*bzc}yziFAwbDy8c*Zmnv;OEXcNvETuCCscwIm-<9)30w1Re$T{1g2FJ z;1_MVgycu9S)d4r2D{-;TT(Q8``4MNfhgFM-hl&K=B{}F5JB@=0RHa;j)LBiV-Db> z$-0n9W0W?LCTwqxm>IfNl)iqC#UHbnC;!fG*jz&$_>Y9_=;xLtD*0`)q8diQlc-`l=*H(t(-Jg4rF{ydZLN98Z|G{sJ9AK0Tm|Q zI0N|U`Dl4Gr{DLo71i(~8mCI5EG@;2_r>*QKWgEO24em`EVXHWvt{48d##1**PEN0 zrVg&ev9Dm3>vTS@Z@sG^ozsm1_V|(=EI%~yrqrO{t*-bZ@Y#6jk5`-|mv1sXe43zg z@-DaG!!6>kueo)0}jnJ01Wr!^^KqL1Pvcij%fqlam^Z z4+Ut9{@mLP4#Ze&?0N0li4fn9J(+3~8Zg`1;P5*(9vXIc#;Z{1SLLwqL7nWI(^odZ z@cO#Ia-~knSk#UOPY5GrUUG4W?c0d-CL(bqVQA>F58KDdM*)i_$&O>VFZqqlM--DA z2@x6Pu)sXQW)%~mt()^&i0!2_RVNqo=0A(pdq;*=S$qxel}E|&1nHTRW==0+hQz(y zOS*r|br%(zdjh}A3Fl^z`raa0zvg@U-L_17MHp=i0>4AJ+y(gORBA zA|Aop*d*TdcZe(PgpU&qo<5i;`Ot2&vt{&g<9~t)hX?J$%i;RKDBtjaB>gd-asc`CaAQ$hJD53T((TO`*Wyd3{pyU9p-2Lr5%;hICt(;AY z!!c5sF0*GDFxnqL#fPG9hSEHmz>Lhc6{41&%KQdIh17l9@d`?91nQM?Ty&|9Egaxm zq230dUUjXI#q^+%ibuu$p%y+L9wX2SjTw6~X2ov{GE+W~`ZD@3@?5g0lEJD-SP=ap z@rC$tdIx_Bs5%HC&sq>2Xz`4MJy}5yu)5C`@2Zs%#ygxi)7HM$!sWB>iqt&FTF#Me zQT2lwAum`6A-@_1{9YYKAKN>-bGb;=Wro}AU51PJO8-gH@5}v`{pCqUz?a-Z2ZO`I z-++zrE#S%&c{CmmgyQ=E;*)*%vVSx+BD519d7`4zREk4Yyy;4%~u=6ZB&;E97 zYI<*38rxANhgT(c7PjlXzf$&fc7Q4E=HyU!R_#)D1ZChmtCWFL(XD<~-KmyQ37Q7k zxdC`RSsIh}M}hNe_m)C)tw9Aqr=?Z-s~D+Y->TCUty`11?Q;~FE0KXS%}VhIXx87w zNeH-ij+r4^r9<$)gB!7rQCYN#c3 zsl!rlxaJi)+~aj+h7b2H29Xit_S84emwGeVe_kNte(sA2Uq7&d**EM~d>34BbVL7k zhFEWKg&zX)JF5_(8Nl{)VJRfI1dt!-9Q^Cx)ClmSXd7Zfy!L)6>n9I_AcrXsJC5@~ylb4`~x_mQUTO=Nlr&ro;KYmQbYo zt7Lll!^zHbKzE1tfj$7u-{i#x{E%nFJl*S67YbnGwujkXHc&DA6|9F=Nk_Ft<_Uw6DYzeam!UT2L({+-)H)l_vecbEW|`ht&4LpLzKr)?x^l< zHN;*&ySJr>iR`i>b+L>D}c=&l#T2A8NH5 zc7+wf=YbBoi62k0o%!*f?6KcN2<#7^E7_0i=I#%!U;B=_Hpb|fc!yjRZ2Da9Z8z?Y zPsLBox!Xfy%bPEtoFp&^3IG5A1i+;DoERtqfSfrn0DvVp000F54uFxdwJoigv6YoA zt%{`TDsn<@qgKI+I5mRMYxHsGs&YTMzGSN`%@%gQkB{zG8n>PC48A#FPR5J#74fPm~Epynma?oN;)j*$G zrZ0$GbkI>jaL3X?Fa~T9sl!#r!^?z&WwB7skM=%DpS^y_;o-(A=Cg$hHeIMM{Z&kI zOwp+srMD_|W2qgO=Ev&xD@zec1_X@cpj(Hf3c`Y7q}9a9CT!+1HKLg7-k*FxS}8>; z8sX|!3G%FB(tWd5>X_)rb{oeoJV3+KO{r*Ay(gp*3RDOD|?D; zKcbpwYo3#{cAd;J;hUb zOo3osB2G36XR6?!7zct^@5m{0TI!lq-|uuVmt5@BiOzI2lu;`#O1XT(`FLk%EpQRr z46qeSM75?{rMV39P7&o&Pla;6lhYcn7c9fB;5#1~FcKRPX(47Fst9p12ARO~oUtr# z^t$Z`xohvT3@aMBXSTNOT3`hK9p-R)*Q}wNA}+M0XqQ^nLPRa6@OGO^EiRudpl!5{ z_SF?ubx2GOy>-|7jr6?^lfCnBTeZyoTwj06Kf+RNyTeC>y%TM{GoocxbYfN)4O z;}*h`OAvXh8#Do)3tSD`ea2{M@V+0t_~GaN%1W58rQHIw7HYELey6V^?qJE*TnE4v z`V$)d-%tvumxH4y-^ThG_?+4fE#V3Te430ul=Ep@;A8gZ5$)clH}enJe}%I7+j0y# zAOJwuFO+HjpHMb4H#M{RT~5XhbcT+O{|V1ki&HiO1TX-*s%edm)W4G=@LmXz5fXBN zM2DH9^1D2dtKQaR7WmspR369pcE#+ZwoLn_uy||z<;A_NAsx-&uyE(!lp*ZhyRi)E zz<}{RYOP03{0@sg;7IXsXyR&Kv3=6`Y8W2Hrd|&lXa97gqqZO4;K3sfvrGxnFs{v3 zYw4GP&~6&i(u&NgaBhjOpVJbvc)d))=b5#8^foC>9$G}@$H6>ZS3W&47;5uOs&rHf*svsPu!*ZswQM*( z6jM_;zPs-<&+{PV{`4hfvsgwp04g-qk=f;9mT3T&G@qGrI zQh@*ANdL#-e{KZ-!TOGd4(4`Fj`aWA;0RdUhX02H{jcvzbL{W{_Ul$3!2Yv~{$Dpc z8ap}L(OLZGCsneR-C#iY-qy7bXKu=kMN54KR0^BDM~XrX>qp2TBX29-#^GwfU5C2c zadpX100AmQEQ^|c*-SXu-rV}O21!9{os?e(UWFDYM>+yj(>8=4&44z&diEfkEZ#IY zC=<5ctf{k9XPg=@g520raqU2$G6rJ)u4*HLsG#cmW6~B6OiDXV+qd2%z@YLl*$l5) zbxqC}jS#IcWe>y%Q>SECe*BR2Dh@r#+=50bl^Cq{N4<2<-V&E<4`^kX0TZ5X|8Qh% z>D?^1Jm`4nR}Ikiz!o`G%t&&SW!f$%Q$!#{r7t7R zcLYb85Ia<<{bIYZr@!gZ4u=tGDF6~OOx&eMS-jcdy@>Z;g9zDfmR3z}v?{o&oiG$xNo zF9w2gj?qw1keg$-J6N|AGq`pKp>KP7u+k|;>td=>B*h7jFOEF;Q~u_u=sIY@Md~hu z+eaz=ijR?tP@2P`s~&PI^l?koSG^N)ON_+#vTkOqBnCYRJ)?NaHn0L2oi5ZOPM!Ie z`9wY&uX=im)O1w2yb}$>c)~JfTd8G|#d1*MvXQ6q>hu+abMW>8a_(-L_Vne0z>=_e zHxJZqhM8Oc6q;9zxSq}@&(FrQ%TGJiOxXtMZ505I@^kC7>nD8M zm-@Xf=wI?)--6ihtoX${nOc7vUq)-ae+tv+joOW^WdERzUTlQex6J3u(`{0?p#;q& z?pNQz|0~Y=_WHysfPUu~g8~3h|9>FZ$yndP$kx^7{|PmD+jRy6pA*$hH-BZyysgF% zm85ha>jGy2#P)L8gan*0wvlNoQ$XpD8!m7lrK)CLW+Y+Pm#w3Yo9XA6ZtT7yP&&oL zXBZit*m8b%FcsBPfj*Ufb@G8caOY{-<~RkV;V+Gjc+!Q+)l|Df*Uti}(p1RV*M|Lc zf=U`t+0-M6=)}g>dXNicus*dZL^h-QEdbh--=|@etEV_7Y7V*q^8*D<3e0_%ELHab1-AHGIAGSO#3^l#AaL z`@Ea)_kUDb1W=n=YA1Xd<3?%QE)t0xB_K#UOw@pOpDpUWT zaf&ewJR<)!T>F>9|Zn8XVVFXd_R;YZ2 z`*bS!y?qy#9={MhUijh&JET4Cs#7awu;+R{G%xE5dq-fs23WW~5&|lt_ zLAyMIpqF4jZC-E-NCSBsKNRoV&`u2n(0GlQy=t3 zI`y91BC|8jX6*6LM!TfSTIQ+tg3FH|B9#BT_-;_aZr3?Yr`m2I2lBS%Y1dWKoVb`U zbR}W-u-zP;PLJmr=N9GqK9=wWe&OBQ@(mrkP@Z5>Qm;UL+x@9@JE@JFqKaP6O0UO< z!w373LZ7YY-=02B3SGe;fY&pM=#N23HB03%A*j zC4`XH610HTj?xi?e?9S}bomz=xxTAN7qf_8t~H$8XWe8DLEp9Yh|o`DA>BBaahB+C zKOFKUI# zD^+pv_&L~o_gnsXAWw&ENsuPiAmw806$dxgBsWqGn|DI3L29Zqa4JVod0JL74AVu| zLE+UjXH)CKyz?Z?Dz%eT4x19FR2~!T26|hL+{k*BNyXwdbDK^ytZ3g;qc@aAp_cZo z_2|G3Tyq_Vl7mD$-y=9=zl>b^DgNrrbfgZ>!U3^rZ$d(I(exPIAXMbHHYTnXe+)x1 z3;`#(`X$gdg5g%0LlIU%;bSSZ_b%+V7^?Qw&o@?`b&~w# zu3qSmIJgb8xtY?O&BZjcAux`W&+Ya7{X=go`qzG6Q1@P;LA4p+Mg10uDv#^il@N?r z0#at=q!Z;kj7Cp{nyXFulzVd}>S&r;CG<;X?ym2nv4&)=&G;Fs0J2caY&LN7z@`1K zcvE#>dRIMZc=zk`(+#~j7x1zE0Jy-xE?6z+JHVz<5;T&)p{TQ7ph5sO`TQTAgb82P z11YUujn9-U?PHygpII{ab}ad1RCg~oz;ndLB{)>TF3l?(Q0^g2a=^ADlEvj(O-M?J zvn9O08n((+l|e_3meOcHftroQ^LEVQ>ZmxC9rc)FD6xV0e*(;$D(qcv3;sOSj@&vl z60#QoU4(2B3+TY`$pwDaJh?PJaSZci1ZH~b; z!a)Mb&vAGu1pDRNV*S*iDb%`)X)*HTrr0}4iDl>*3Sufu<2ypf0hs#Lkb_UpLCd`N zo?gkpo!C@R(GJ<2J{bBkKQBO1T<%HEr`kaf(-!$%_cIy*)t-IUX{ZCna*J(^N+aL% z4HN;*p#aw=@+KM$2Km|Ofw{5wV{1a;EgPwDz^G}C3JPe_?*qZ*;u&uYOxGgh;`V2v z?5A+T{p18g32!hW80ku(d)c@g7s))XjJ+QCQq zgyIcTZH8|KwbkyNIi&alvRnFL0i>BP1(5wVhzFQ^WkZ0Xv9fvrA#P8(v%2f69VG^c z5nf3CvX&B2YNc$Q!8>Rse*XlSxs-h$`adO35YioD<6uR(6OIKd^k44@Ni; z6j?Xuv1ZA&N{i&-QCROFhwP5h#A1zBSsS5zd?nt9B*OvacY2ql{jAw+0Jyl_K(+WNStz}ZTdj}YKkT$R)WCCcNzAzk=XculC|ERRI#nK06X1x&0PvF$b; zoRp5tN0M*n7e-?O-O8BDM)U&D)P=bF<+W-i<|5(ZTauoU1#_e?Ddgym9-E0TLw=_a z$LY_A68&4U0)0*6=z3CSkb2V3N06uPoGKefEDk26aaq>|} z;&k4ExL?v|EeZU5><|^mCdmhuUvsiwBUWLz(Q^0duO9X^I_C|xd%SGqU0H+Rq$s^^1d?w`Cufa*W(fmo7^#W%Faz) z6Euezp#xlzC^kpQapz|*IB(-0YOEp8@EznlDf`U`Y$YhQVD58NAb-q`-?WwmuJ=Kh z$ac#SGoJxt+))DVOrm2yn#(NyAMh;+kgXr!8?9cZCHPdmSqB(@BL9EU*!hxk59)tz z0JXvOx!!U^k3fS;V_2P|xZ%V7EC76di&*lJxT}na;N0@hm9ctcnK075yigtE-L|z` z%((1Xm65AQ%GB6pecPW_F6^~LkYiQY_6-4-&N3R(YwDW(IkR&VxE8wEujtoE>v{{6 zx`=?^esRJovJ=thfxz}57ZtRnGbFa4BVpTqKC4dnB4Rt#4k3Bz<5pansh*Vb-7;qAb(3=aeC#Y z^@g%+n-VgaI8G3vQ9tL96hRrKhKl1bC=|^^y^8}yiH}n0-TjsAoqJJ4Zi3X}=n$Hr zx?%dztDxs=Wh*hDy3-=Kl4OIA8=a})A=jeiA?)P9ZT|EXn5yBmftV9pu>y_C;}913 z|FG2&$!?g??a30T$7v8Ui9uDVP(C|YW1WVzc7tDfAfI0bbsi=}BbaM0qAwlz0B@G> zg+gd>JVk90erMq*DR{GAlXRCbVLfjedEW1m$(vsm)cT&}MGqnTdlqoTAm8L^xAF{Z z#h9l+)_kGG6spTSn>KE4PzEMZLv(Xo?pJgLz{16++hDgz11b9Sj=Y3l3#>Io+P#-6~_aQ%%Z*1`1Sa4kuoH%*G8j^>RT8C63Tk~b0cDV6ec zQN4kPLOk=q#DKdLk?B_86k;f4l?B;xyWjLmq7RG-ixjt6@hx$iUVIH|5Q5bkc`;F7 z#OT5(Ph6?Z)cKVc{6ReS$ejn5A5xnKK6J7WWT`8tn*wmF8hvzZjZg$Mi_!@rIaWowth6N*4})uFolz2Tn@Avx~`X zg&oZ-&CRt^R&ERb&|aBfAjojPCEHg&Ft$5SpY=*Ux65;_Ea@vkjyJk;dAvxOFZdfa zU#X+%x0fwelV{(pcsu<{ayBnC!_4uQAyWzMRfRqUo{~nlgt*A!R35v%*-=Wo45);0 z#MiNJ=i3u~6SZBPNgnS>s4^e;5z~41B{pL4^UjX=$boFSc5lPayRI{uHAfzyPtId; zAcu0DlAPw2e$Y=MYAIc=WivV^GR2^xd0XIURNhOzRIEJLle~gb|GSu;vvUuysw6Cw zq=OK)gS>W}8ZCjMKHdT$VYBS6Mh^9|VQ!x8Y@9m}*IYaI@J8)2wcDmk;xam@pX)dJAtj%Yc@;_Vto!(nYAh^s1}2k4Sp3 zV7>G)#WFvD?Yu)_A$Ag0OA_#8?6#qBTZq_kIU!?CEwmY@$2edtc_W-_&)FTtCtm&< zUi>vdnqTWzXuV#_4)OMlBzpi@uhQ?^`*8s1YkDXL(_6?s0 z>3Mz(EDj#-38;8bW95J@8}6>BM6#(Z^U8H#Ce-8)_OKp)Orh*zjFf$iR`l4}78-SA zVegaXk6FqH47~y)ul&O@?~qR|*A&a2(~U2s#$^}JYfr!rz9^oJKjcp@^i=yxS^&+gz)5L{320*ovb#nf7E-yKVZM#;U+42r=S;H#@xRy0hQ+ED5aEv zq46mLHNQg-zwh|+wxrudPlT`BKMqSC=2CTreT$O=1mdL65K; zS5A-@j&}!{lUsC=r5IyxZl*)`>)3Ab7cO%J$~+PoGc*$J zO&8QMiA@)$TQK4{D`a<2#jze;8;cl+B^h+QDxBJJqM_qPTV<&PzbRj5TexV7?&)^K zjhj4VLYfv=n)fl7MzmK>f9!v*qxgzMBHE4X`GQJB!(}-gI|b}r3kyq&)*4FPIw^PL zK+LdeUm7jk8o1~;byw=c-N^xDW|PXFdmr^JvP+6AoMvf6ud-<6lK-=_$l7Og>epcVBk(KKRNTQye~iR9rlxyEHs+EFjuQ~Jwtu& zizJ2D#G7ozG)K15q*+I&`Vff`mW)f5tl;F{W1D^<}7L zxW48zPirRsh0wjVge`7TuLx+e8(YYplrZ^bXy zbBj#JviCaFzq&cdyOeT}B{uTS;XaRg!{CL$9FDnVy*jdKp^}2Q#M_XdWZ2FpbUX#! zS0Em0G-=|PXUHG(aQ(rF$r;;k%YQvfuhsXs7|wW}2OqUY$pL_Wi%Yzjwz`(Fwj|=z zR@eB@qsGW~HAu~uyBzbc8M5S#X$0x4`y?88#OyAHTY*!>o zx6O1o?sB+!-&>wM(a}QraGm2lr6j9(KAtwFtck;?4Qt-OmwYponkHMwONu$RVLtOl62)|h`K_;2 zE@p3F838Hf(m$Y9EZouDP1Ptn#v1!`3sb|{CuV3zskPy@R+s}?!x5U$r>QziN(yI% z_9+}g^^th1NiZvw*Wa-A)#LMD%0#Ar!djMRekylzBu()*NDL^-jurd}yXsq>K=J`% zGgA43i_>R@H?&DWMc6Hl!3YpVTU6J+l={ZbIS_fTVuF>-$ov#-)8!<~Z>Nv$eM0s$ znQ=HQxLY^*g6@a0S@nxHjpyC{-V6Nn|Ms1>qmWC{NnqOD$X>h4f!;JU3o?QUIO1Qc zWrb}zLq3)`B82Y!KxLrdT&!T?D_W$N)T58kds}9~FHSva5Pl*^^k{^aTzHK0klEP` z%~OJv+PUKV&h)g!l z%sKukGmg8T`&Gu-xWwA&&$#n+j0D!F#A8Br^E|sdNskwt_LG~tAfi)&6-d-#2A^e zA5t@7aT%p=ZK{Xv()1H;){T%$(&O*V(sGLW5iV6HhJrUwFWFsfw0R zg9IS5?sOqdeV)P8HLJo8$Mhr48WyP|AeTFo%Yq-+OU(@qQxB-L@%TXM=?p1o%li64 z&X=iWRF;WAb7VpipW8O``t|;~i@i&`L?l)6@#r)E_H&7O<7vM3mK;&;bzbCCmO>`H zPN7YES(h(Xo%;F;Ve^$G>(OPd_*;}Vd?BocV_r>XrkKk-e>N;phk*?cSwAg&B%Y~v z$lM}}d>M2)L!yEthu!1m$>D|_x%+a>gpP)Ub*KL^sx@?9@UAdZoF!QJP}&#ny*uWi zn{ZD-{d-p?a^v>7eAdrmDO7{ha*qxqwpdIrgoXHYr)H@+wm3KP9ZFt|j<$cql{Q&o zD=?goYU;JDc=^YER~PQ=Zc(*{6sxQ6?Mo-~W5<`N(>_YmEbb2znS89tpB}fj-_X9{p6Oc$S;N zesn-is0JpxVDY; zv-9B1ZnnkjZt#;}-4P^g@I<>J|Jue8{Dr+1H;xbSgc$)wL`d2}OI12CE zR)jD(pV+@B$3WO-R>JAwNF)X4i@0AsR*c|$-@&mLPnV7@CLbxiL;u>j~Qk*P;wD)`4h&|CzUV+19t&S{mEzSUwGw_u>bQa2&1Z442>bIm8h5U@ppX!qoe zEsY-r0~(h;Vt5wQXCkN#4s;TVc3Nr5*vfosxjNl|wKE1`=HQUP11=B;bo4@FkO;!a zjg2XUXUrmIf;xITxt~I!2-tID)~b2{fLlr-pba*Sz?JCu&2shhazgnMK(1Ld2p&IX zCQky`a*zXZcoy~9E^>uTFyS^_qOthQFY(lXk7qcm?i<#@g!om z|34)noMUT2D9o2Icu4~Q+EYjXZ9FmdWdFZnAmHxX5#>W;`i0A2Ex1h`0FK~^vTyAF z6lJ}Sh?0t!m{ptKzEp683xRA|b4_LhR#Sr?0QC3Zmig7w9qx2g_#eqGZoVEcxFZ;> z5-_Nnvm4yq1ufwNgJYZ|J=|T0-K;0fMRZi90bm&%tGNVj3ZPv6+@#xHJ8%}+NG`$> zZR{h_zb%DZyw#0~l?V+Z+A(dkT3uN1M)-gg01n{=YUXxuXqba5)Em0eQb%y@UWl;87@Ze)M+kpS8Gjyv%$eN?$r|kMv zwE+M(Ru9=Lp@*{DoQ{EcAx^qO;ckRuYR$@NF7KPGz`5tZGcf+$1d_2i${2du3D?HH zbuO(bgcE-CYxUr}a_kVy+?=w~D8DshO_M4o{z?GU;tDucvjhBy%U6O7GzN-+JO1v* z-^xd8xMRmZG*FoWKxQAwKTf87S%g&j`$(~!eS=1C->?h zc!gG~Mu_$wGkP`nao<fCk>|+`Za{Ol%6^w>Pgh<7FZ!Yt7EYnGwIqb3JWF zo3KuJEuX{z@w@2O1IhI_2maktM;rwIm47|tx#i}Nb#MN}Vep?^*JCnlHpi?zz-~sN V06W`pS7k9k5xhLA*@OEx@IQc5mC67B literal 0 HcmV?d00001 diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index ce778715..88c0f975 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -12,6 +12,10 @@ wget --no-check-certificate "https://phar.phpunit.de/phpunit-9.5.phar" mv phpunit-9.5.phar ./phpunit fi +if [[ "$TRAVIS_PHP_VERSION" == "8.1" ]] ; then +wget --no-check-certificate "https://phar.phpunit.de/phpunit-9.5.phar" +mv phpunit-9.5.phar ./phpunit +fi chmod +x ./phpunit echo "./phpunit --version" From 7254837dafd9aeea3a4006b453283aff9c3507fc Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 21 Oct 2022 17:30:28 +0200 Subject: [PATCH 100/101] pull latest arangod devel for testing (#297) --- tests/travis/setup_arangodb.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/travis/setup_arangodb.sh b/tests/travis/setup_arangodb.sh index 88c0f975..b0f0e00f 100644 --- a/tests/travis/setup_arangodb.sh +++ b/tests/travis/setup_arangodb.sh @@ -24,8 +24,8 @@ echo "./phpunit --version" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $DIR -docker pull arangodb/arangodb-preview:3.9.0-nightly -docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:3.9.0-nightly arangod --database.extended-names-databases true +docker pull arangodb/arangodb-preview:devel-nightly +docker run -d -e ARANGO_ROOT_PASSWORD="test" -p 8529:8529 arangodb/arangodb-preview:devel-nightly arangod --database.extended-names-databases true sleep 2 From db8b154f0e82f147945db3c8bcb52b922894db5d Mon Sep 17 00:00:00 2001 From: Simran Date: Tue, 17 Jan 2023 12:15:19 +0100 Subject: [PATCH 101/101] Add documentation back (#302) This re-adds the driver tutorial with some minor changes --- README.md | 976 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 965 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index c4cc6ee5..c269ff83 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,975 @@ -![ArangoDB-Logo](https://www.arangodb.com/docs/assets/arangodb_logo_2016_inverted.png) - # ArangoDB-PHP - A PHP client for ArangoDB -The official ArangoDB PHP Driver. +This driver for ArangoDB, called the ArangoDB-PHP client, +allows REST-based access to documents on the server. The _DocumentHandler_ class +should be used for these purposes. There is an example for REST-based documents +access in the [`examples/document.php`](examples/document.php) file. + +Furthermore, the PHP client also allows to issue more AQL complex queries using +the _Statement_ class. There is an example for this kind of statements in the +[`examples/aql-query.php`](examples/aql-query.php) file. + +To use the PHP client, you must include the file `autoloader.php` from the main +directory. The autoloader cares about loading additionally required classes on +the fly. The autoloader can be nested with other autoloaders. + +The ArangoDB PHP client is an API that allows you to send and retrieve documents +from ArangoDB from out of your PHP application. The client library itself is +written in PHP and has no further dependencies but just plain PHP 5.6 +(or higher). + +The client library provides document and collection classes you can use to work +with documents and collections in an object-oriented fashion. When exchanging +document data with the server, the library internally uses the +[HTTP REST interface of ArangoDB](https://www.arangodb.com/docs/stable/http/index.html). +The library user does not have to care about this fact as all the details of the +REST interface are abstracted by the client library. + +## Requirements + +- PHP version 5.6 or higher + +Note on PHP version support: + +This driver ceases to support old PHP versions as soon as they have reached +end-of-life status. Support is removed with the next minor or patch version of +the driver to be released. + +In general, it is recommended to always use the latest PHP versions in order to +take advantage of all the improvements (especially in performance). + +## Important version information on ArangoDB-PHP + +The ArangoDB-PHP driver version has to match with the ArangoDB version: + +- ArangoDB-PHP v3.8.x is on par with the functionality of ArangoDB v3.8.x +- ArangoDB-PHP v3.9.x is on par with the functionality of ArangoDB v3.9.x + +etc. + +## Installation using Composer or Git + +To get started, you need PHP 5.6 or higher plus an ArangoDB server running on +any host that you can access. + +There are two alternative ways to get the ArangoDB PHP client: + +- Using Composer +- Cloning the git repository + +### Alternative 1: Using Composer + +If you use [Composer](https://getcomposer.org/), you can run the following +command in a command-line to install the PHP client: + +``` +composer require triagens/arangodb +``` + +### Alternative 2: Cloning the Git repository + +When preferring this alternative, you need to have a +[Git client](https://git-scm.com/downloads) installed. To clone the +ArangoDB-PHP client repository from GitHub, execute the following command in +your project directory: + +``` +git clone "https://github.com/arangodb/arangodb-php.git" +``` + +This creates an `arangodb-php` subdirectory in your current directory. It +contains all the files of the client library. It also includes a dedicated +autoloader that you can use for autoloading the client libraries class files. +To invoke this autoloader, add the following line to your PHP files that need +the library: + +```php +require 'arangodb-php/autoload.php'; +``` + +The ArangoDB-PHP client's autoloader only cares about its own class files and +does not handle any other files. That means it is fully nestable with other +autoloaders. + +If you do not wish to include autoload.php to load and setup the autoloader, you +can invoke the autoloader directly: + +```php +require 'arangodb-php/lib/ArangoDBClient/autoloader.php'; +\ArangoDBClient\Autoloader::init(); +``` + +## Set up the connection + +In order to use ArangoDB, you need to specify the connection options. You can do +so by creating a PHP array `$connectionOptions`. Put this code into a file named +`test.php` in your current directory: + +```php +// use the following line when using Composer +// require __DIR__ . '/vendor/composer/autoload.php'; + +// use the following line when using git +require __DIR__ . '/arangodb-php/autoload.php'; + +// set up some aliases for less typing later +use ArangoDBClient\Collection as ArangoCollection; +use ArangoDBClient\CollectionHandler as ArangoCollectionHandler; +use ArangoDBClient\Connection as ArangoConnection; +use ArangoDBClient\ConnectionOptions as ArangoConnectionOptions; +use ArangoDBClient\DocumentHandler as ArangoDocumentHandler; +use ArangoDBClient\Document as ArangoDocument; +use ArangoDBClient\Exception as ArangoException; +use ArangoDBClient\ConnectException as ArangoConnectException; +use ArangoDBClient\ClientException as ArangoClientException; +use ArangoDBClient\ServerException as ArangoServerException; +use ArangoDBClient\Statement as ArangoStatement; +use ArangoDBClient\UpdatePolicy as ArangoUpdatePolicy; + +// set up some basic connection options +$connectionOptions = [ + // database name + ArangoConnectionOptions::OPTION_DATABASE => '_system', + // server endpoint to connect to + ArangoConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529', + // authorization type to use (currently supported: 'Basic') + ArangoConnectionOptions::OPTION_AUTH_TYPE => 'Basic', + // user for basic authorization + ArangoConnectionOptions::OPTION_AUTH_USER => 'root', + // password for basic authorization + ArangoConnectionOptions::OPTION_AUTH_PASSWD => '', + // connection persistence on server. can use either 'Close' (one-time connections) or 'Keep-Alive' (re-used connections) + ArangoConnectionOptions::OPTION_CONNECTION => 'Keep-Alive', + // connect timeout in seconds + ArangoConnectionOptions::OPTION_TIMEOUT => 3, + // whether or not to reconnect when a keep-alive connection has timed out on server + ArangoConnectionOptions::OPTION_RECONNECT => true, + // optionally create new collections when inserting documents + ArangoConnectionOptions::OPTION_CREATE => true, + // optionally create new collections when inserting documents + ArangoConnectionOptions::OPTION_UPDATE_POLICY => ArangoUpdatePolicy::LAST, +]; + +// turn on exception logging (logs to whatever PHP is configured) +ArangoException::enableLogging(); + +$connection = new ArangoConnection($connectionOptions); +``` + +This makes the client connect to ArangoDB + +- running on localhost (`OPTION_HOST`) +- on the default port 8529 (`OPTION_PORT`) +- with a connection timeout of 3 seconds (`OPTION_TIMEOUT`) + +When creating new documents in a collection that does not yet exist, you have +the following choices: + +- **auto-generate a new collection**: + if you prefer that, set `OPTION_CREATE` to `true` + +- **fail with an error**: + if you prefer this behavior, set `OPTION_CREATE` to `false` + +When updating a document that was previously/concurrently updated by another +user, you can select between the following behaviors: + +- **last update wins**: + if you prefer this, set `OPTION_UPDATE_POLICY` to last + +- **fail with a conflict error**: + if you prefer that, set `OPTION_UPDATE_POLICY` to conflict + +### Setting up Active Failover + +By default, the PHP client connects to a single endpoint only, by specifying a +string value for the endpoint in the connection options, e.g. + +```php +$connectionOptions = [ + ArangoConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529' +]; +``` + +To set up multiple servers to connect to, it is also possible to specify an +array of servers instead: + +```php +$connectionOptions = [ + ArangoConnectionOptions::OPTION_ENDPOINT => [ 'tcp://localhost:8531', 'tcp://localhost:8532', 'tcp://localhost:8530' ] +]; +``` + +Using this option requires ArangoDB 3.3 or higher and the database running in +Active Failover mode. + +The driver tries to connect to the first server endpoint in the endpoints array +by default, and only try the following servers if no connection can be +established. If no connection can be made to any server, the driver throws an +exception. + +As it is unknown to the driver which server from the array is the current +leader, the driver connects to the specified servers in array order by default. +However, to spare a few unnecessary connection attempts to failed servers, it is +possible to set up caching (using Memcached) for the server list. The cached +value contains the last working server first, so that as few connection attempts +as possible need to be made. + +In order to use this caching, it is required to install the Memcached module for +PHP, and to set up the following relevant options in the connection options: + +```php +$connectionOptions = [ + // memcached persistent id (will be passed to Memcached::__construct) + ArangoConnectionOptions::OPTION_MEMCACHED_PERSISTENT_ID => 'arangodb-php-pool', + + // memcached servers to connect to (will be passed to Memcached::addServers) + ArangoConnectionOptions::OPTION_MEMCACHED_SERVERS => [ [ '127.0.0.1', 11211 ] ], + + // memcached options (will be passed to Memcached::setOptions) + ArangoConnectionOptions::OPTION_MEMCACHED_OPTIONS => [ ], + + // key to store the current endpoints array under + ArangoConnectionOptions::OPTION_MEMCACHED_ENDPOINTS_KEY => 'arangodb-php-endpoints' + + // time-to-live for the endpoints array stored in memcached + ArangoConnectionOptions::OPTION_MEMCACHED_TTL => 600 +]; +``` + +## Create collections + +> This is just to show how a collection is created. For these examples it is not +> needed to create a collection prior to inserting a document, as we set +> `ArangoConnectionOptions::OPTION_CREATE` to `true`. + +So, after we get the settings, we can start with creating a collection. We +create a collection named _users_. + +The below code first sets up the collection locally in a variable name `$user`, +and then pushes it to the server and returns the collection ID created by the +server: + +```php +$collectionHandler = new ArangoCollectionHandler($connection); + +// clean up first +if ($collectionHandler->has('users')) { + $collectionHandler->drop('users'); +} +if ($collectionHandler->has('example')) { + $collectionHandler->drop('example'); +} + +// create a new collection +$userCollection = new ArangoCollection(); +$userCollection->setName('users'); +$id = $collectionHandler->create($userCollection); + +// print the collection id created by the server +var_dump($id); +// check if the collection exists +$result = $collectionHandler->has('users'); +var_dump($result); +``` + +## Create documents + +After we created the collection, we can start with creating an initial document. +We create a user document in a collection named _users_. This collection does +not need to exist yet. The first document we insert in this collection creates +the collection on the fly. This is because we have set `OPTION_CREATE` to `true` +in `$connectionOptions`. + +The below code first sets up the document locally in a variable name `$user`, +and then pushes it to the server and returns the document ID created by the +server: + +```php +$handler = new ArangoDocumentHandler($connection); + +// create a new document +$user = new ArangoDocument(); + +// use set method to set document properties +$user->set('name', 'John'); +$user->set('age', 25); +$user->set('thisIsNull', null); +$user->set('obj', ['nested' => True]); + +// use magic methods to set document properties +$user->likes = ['fishing', 'hiking', 'swimming']; + +// send the document to the server +$id = $handler->save('users', $user); + +// check if a document exists +$result = $handler->has('users', $id); +var_dump($result); + +// print the document id created by the server +var_dump($id); +var_dump($user->getId()); +``` + +Document properties can be set by using the `set()` method, or by directly +manipulating the document properties. + +As you can see, sending a document to the server is achieved by calling the +`save()` method on the client library's _DocumentHandler_ class. It needs the +collection name (_users_ in this case) plus the document object to be saved. +`save()` returns the document ID as created by the server. The ID is a numeric +value that might or might not fit in a PHP integer. + +## Add exception handling + +The above code works but it does not check for any errors. To make it work in +the face of errors, we wrap it into some basic exception handlers: + +```php +try { + $handler = new ArangoDocumentHandler($connection); + + // create a new document + $user = new ArangoDocument(); + + // use set method to set document properties + $user->set('name', 'John'); + $user->set('age', 25); + + // use magic methods to set document properties + $user->likes = ['fishing', 'hiking', 'swimming']; + + // send the document to the server + $id = $handler->save('users', $user); + + // check if a document exists + $result = $handler->has('users', $id); + var_dump($result); + + // print the document id created by the server + var_dump($id); + var_dump($user->getId()); +} catch (ArangoConnectException $e) { + print 'Connection error: ' . $e->getMessage() . PHP_EOL; +} catch (ArangoClientException $e) { + print 'Client error: ' . $e->getMessage() . PHP_EOL; +} catch (ArangoServerException $e) { + print 'Server error: ' . $e->getServerCode() . ':' . $e->getServerMessage() . ' ' . $e->getMessage() . PHP_EOL; +} +``` + +## Retrieve documents + +To retrieve a document from the server, the `get()` method of the +_DocumentHandler_ class can be used. It needs the collection name plus a +document ID. There is also the `getById()` method which is an alias for `get()`. + +```php +// get the document back from the server +$userFromServer = $handler->get('users', $id); +var_dump($userFromServer); + +/* +The result of the get() method is a Document object that you can use in an OO fashion: + +object(ArangoDBClient\Document)##6 (4) { + ["_id":"ArangoDBClient\Document":private]=> + string(15) "2377907/4818344" + ["_rev":"ArangoDBClient\Document":private]=> + int(4818344) + ["_values":"ArangoDBClient\Document":private]=> + array(3) { + ["age"]=> + int(25) + ["name"]=> + string(4) "John" + ["likes"]=> + array(3) { + [0]=> + string(7) "fishing" + [1]=> + string(6) "hiking" + [2]=> + string(8) "swimming" + } + } + ["_changed":"ArangoDBClient\Document":private]=> + bool(false) +} +*/ +``` + +Whenever the document ID is yet unknown, but you want to fetch a document from +the server by any of its other properties, you can use the +`CollectionHandler->byExample()` method. It allows you to provide an example of +the document that you are looking for. The example should either be a _Document_ +object with the relevant properties set, or, a PHP array with the properties +that you are looking for: + +```php +// get a document list back from the server, using a document example +$cursor = $collectionHandler->byExample('users', ['name' => 'John']); +var_dump($cursor->getAll()); +``` + +This returns all documents from the specified collection (here: _users_) with +the properties provided in the example (here: that have an attribute `name` with +a value of `"John"`). The result is a cursor which can be iterated sequentially +or completely. We have chosen to get the complete result set above by calling +the cursor's `getAll()` method. + +`CollectionHandler->byExample()` returns multiple documents if the example is +ambiguous. + +## Update documents + +To update an existing document, the `update()` method of the _DocumentHandler_ +class can be used. In this example we want to: + +- set state to `'CA'` +- change the `likes` array + +```php +// update a document +$userFromServer->likes = ['fishing', 'swimming']; +$userFromServer->state = 'CA'; + +$result = $handler->update($userFromServer); +var_dump($result); + +$userFromServer = $handler->get('users', $id); +var_dump($userFromServer); +``` + +To remove an attribute using the `update()` method, an option has to be passed +telling it to not keep attributes with null values. In this example we want to +remove the `age`: + +```php +// update a document removing an attribute, +// The 'keepNull'=>false option will cause ArangoDB to +// remove all attributes in the document, +// that have null as their value - not only the ones defined here + +$userFromServer->likes = ['fishing', 'swimming']; +$userFromServer->state = 'CA'; +$userFromServer->age = null; + +$result = $handler->update($userFromServer, ['keepNull' => false]); +var_dump($result); + +$userFromServer = $handler->get('users', $id); +var_dump($userFromServer); +``` + +The document that is updated using the previous example must have been fetched +from the server before. If you want to update a document without having fetched +it from the server before, use `updateById()`: + +```php +// update a document, identified by collection and document id +$user = new ArangoDocument(); +$user->name = 'John'; +$user->likes = ['Running', 'Rowing']; + +// Notice that for the example we're getting the existing +// document id via a method call. Normally we would use the known id +$result = $handler->updateById('users', $userFromServer->getId(), $user); +var_dump($result); + +$userFromServer = $handler->get('users', $id); +var_dump($userFromServer); +``` + +## Replace documents + +To completely replace an existing document, the `replace()` method of the +_DocumentHandler_ class can be used. In this example we want to remove the +`state` attribute: + +```php +// replace a document (notice that we are using the previously fetched document) +// In this example we are removing the state attribute +unset($userFromServer->state); -- [Getting Started](https://www.arangodb.com/docs/stable/drivers/php-getting-started.html) -- [Tutorial](https://www.arangodb.com/docs/stable/drivers/php-tutorial.html) +$result = $handler->replace($userFromServer); +var_dump($result); -# More information +$userFromServer = $handler->get('users', $id); +var_dump($userFromServer); +``` + +The document that is replaced using the previous example must have been fetched +from the server before. If you want to replace a document without having fetched +it from the server before, use `replaceById()`: + +```php +// replace a document, identified by collection and document id +$user = new ArangoDocument(); +$user->name = 'John'; +$user->likes = ['Running', 'Rowing']; + +// Notice that for the example we're getting the existing +// document id via a method call. Normally we would use the known id +$result = $handler->replaceById('users', $userFromServer->getId(), $user); +var_dump($result); + +$userFromServer = $handler->get('users', $id); +var_dump($userFromServer); +``` + +## Delete documents + +To remove an existing document on the server, the `remove()` method of the +_DocumentHandler_ class can be used. `remove()` just needs the document to be +removed as a parameter: + +```php +// remove a document on the server, using a document object +$result = $handler->remove($userFromServer); +var_dump($result); +``` + +Note that the document must have been fetched from the server before. If you +haven't fetched the document from the server before, use the `removeById()` +method. This requires just the collection name (here: _users_) and the +document ID. + +```php +// remove a document on the server, using a collection id and document id +// In this example, we are using the id of the document we deleted in the previous example, +// so it will throw an exception here. (we are catching it though, in order to continue) + +try { + $result = $handler->removeById('users', $userFromServer->getId()); +} catch (\ArangoDBClient\ServerException $e) { + $e->getMessage(); +} +``` + +## Drop collections + +To drop an existing collection on the server, use the `drop()` method of the +_CollectionHandler_ class. `drop()` just needs the name of the collection name +to be dropped: + +```php +// drop a collection on the server, using its name, +$result = $collectionHandler->drop('users'); +var_dump($result); + +// drop the other one we created, too +$collectionHandler->drop('example'); +``` + +## Run AQL queries + +To run an AQL query, use the _Statement_ class. + +The method `Statement::execute` creates a Cursor object which can be used to +iterate over the query's result set. + +```php +// create a statement to insert 1000 test users +$statement = new ArangoStatement( + $connection, [ + 'query' => 'FOR i IN 1..1000 INSERT { _key: CONCAT("test", i) } IN users' + ] +); + +// execute the statement +$cursor = $statement->execute(); + +// now run another query on the data, using bind parameters +$statement = new ArangoStatement( + $connection, [ + 'query' => 'FOR u IN @@collection FILTER u.name == @name RETURN u', + 'bindVars' => [ + '@collection' => 'users', + 'name' => 'John' + ] + ] +); + +// executing the statement returns a cursor +$cursor = $statement->execute(); + +// easiest way to get all results returned by the cursor +var_dump($cursor->getAll()); + +// to get statistics for the query, use Cursor::getExtra(); +var_dump($cursor->getExtra()); +``` + +Note: by default the Statement object will create a Cursor that converts each +value into a Document object. This is normally the intended behavior for AQL +queries that return entire documents. However, an AQL query can also return +projections or any other data that cannot be converted into Document objects. + +In order to suppress the conversion into Document objects, the Statement must be +given the `_flat` attribute. This allows processing the results of arbitrary AQL +queries: + +```php +// run an AQL query that does not return documents but scalars +// we need to set the _flat attribute of the Statement in order for this to work +$statement = new ArangoStatement( + $connection, [ + 'query' => 'FOR i IN 1..1000 RETURN i', + '_flat' => true + ] +); + +// executing the statement returns a cursor +$cursor = $statement->execute(); + +// easiest way to get all results returned by the cursor +// note that now the results won't be converted into Document objects +var_dump($cursor->getAll()); +``` + +## Bulk document handling + +The ArangoDB-PHP driver provides a mechanism to easily fetch multiple documents +from the same collection with a single request. All that needs to be provided is +an array of document keys: + +```php +$exampleCollection = new ArangoCollection(); +$exampleCollection->setName('example'); +$id = $collectionHandler->create($exampleCollection); + +// create a statement to insert 100 example documents +$statement = new ArangoStatement( + $connection, [ + 'query' => 'FOR i IN 1..100 INSERT { _key: CONCAT("example", i), value: i } IN example' + ] +); +$statement->execute(); + +// later on, we can assemble a list of document keys +$keys = []; +for ($i = 1; $i <= 100; ++$i) { + $keys[] = 'example' . $i; +} +// and fetch all the documents at once +$documents = $collectionHandler->lookupByKeys('example', $keys); +var_dump($documents); + +// we can also bulk-remove them: +$result = $collectionHandler->removeByKeys('example', $keys); + +var_dump($result); +``` + +## Custom Document class + +If you want to use custom document class you can pass its name to +_DocumentHandler_ or _CollectionHandler_ using method `setDocumentClass`. +Remember that Your class must extend `\ArangoDBClient\Document`. + +```php +$ch = new CollectionHandler($connection); +$ch->setDocumentClass('\AppBundle\Entity\Product'); +$cursor = $ch->all('product'); +// All returned documents will be \AppBundle\Entity\Product instances + +$dh = new DocumentHandler($connection); +$dh->setDocumentClass('\AppBundle\Entity\Product'); +$product = $dh->get('products', 11231234); +// Product will be \AppBundle\Entity\Product instance +``` + +See the [`examples/customDocumentClass.php`](examples/customDocumentClass.php) +file for more details. + +## Log exceptions + +The driver provides a simple logging mechanism that is turned off by default. +If it is turned on, the driver logs all its exceptions using PHP's standard +`error_log` mechanism. It calls PHP's `error_log()` function for this. It +depends on the PHP configuration if and where exceptions are logged. Please +consult your `php.ini` settings for further details. + +To turn on exception logging in the driver, set a flag on the driver's +_Exception_ base class, from which all driver exceptions are subclassed: + +```php +use ArangoDBClient\Exception as ArangoException; + +ArangoException::enableLogging(); +``` + +To turn logging off, call its `disableLogging` method: + +```php +use ArangoDBClient\Exception as ArangoException; + +ArangoException::disableLogging(); +``` + +## Put it all together + +Here is the full code that combines all the pieces outlined above: + +```php +// use the following line when using Composer +// require __DIR__ . '/vendor/composer/autoload.php'; + +// use the following line when using git +require __DIR__ . '/autoload.php'; + +// set up some aliases for less typing later +use ArangoDBClient\Collection as ArangoCollection; +use ArangoDBClient\CollectionHandler as ArangoCollectionHandler; +use ArangoDBClient\Connection as ArangoConnection; +use ArangoDBClient\ConnectionOptions as ArangoConnectionOptions; +use ArangoDBClient\DocumentHandler as ArangoDocumentHandler; +use ArangoDBClient\Document as ArangoDocument; +use ArangoDBClient\Exception as ArangoException; +use ArangoDBClient\ConnectException as ArangoConnectException; +use ArangoDBClient\ClientException as ArangoClientException; +use ArangoDBClient\ServerException as ArangoServerException; +use ArangoDBClient\Statement as ArangoStatement; +use ArangoDBClient\UpdatePolicy as ArangoUpdatePolicy; + +// set up some basic connection options +$connectionOptions = [ + // database name + ArangoConnectionOptions::OPTION_DATABASE => '_system', + // server endpoint to connect to + ArangoConnectionOptions::OPTION_ENDPOINT => 'tcp://127.0.0.1:8529', + // authorization type to use (currently supported: 'Basic') + ArangoConnectionOptions::OPTION_AUTH_TYPE => 'Basic', + // user for basic authorization + ArangoConnectionOptions::OPTION_AUTH_USER => 'root', + // password for basic authorization + ArangoConnectionOptions::OPTION_AUTH_PASSWD => '', + // connection persistence on server. can use either 'Close' (one-time connections) or 'Keep-Alive' (re-used connections) + ArangoConnectionOptions::OPTION_CONNECTION => 'Keep-Alive', + // connect timeout in seconds + ArangoConnectionOptions::OPTION_TIMEOUT => 3, + // whether or not to reconnect when a keep-alive connection has timed out on server + ArangoConnectionOptions::OPTION_RECONNECT => true, + // optionally create new collections when inserting documents + ArangoConnectionOptions::OPTION_CREATE => true, + // optionally create new collections when inserting documents + ArangoConnectionOptions::OPTION_UPDATE_POLICY => ArangoUpdatePolicy::LAST, +]; + + +// turn on exception logging (logs to whatever PHP is configured) +ArangoException::enableLogging(); + +try { + $connection = new ArangoConnection($connectionOptions); + + $collectionHandler = new ArangoCollectionHandler($connection); + + // clean up first + if ($collectionHandler->has('users')) { + $collectionHandler->drop('users'); + } + if ($collectionHandler->has('example')) { + $collectionHandler->drop('example'); + } + + // create a new collection + $userCollection = new ArangoCollection(); + $userCollection->setName('users'); + $id = $collectionHandler->create($userCollection); + + // print the collection id created by the server + var_dump($id); + + // check if the collection exists + $result = $collectionHandler->has('users'); + var_dump($result); + + $handler = new ArangoDocumentHandler($connection); + + // create a new document + $user = new ArangoDocument(); + + // use set method to set document properties + $user->set('name', 'John'); + $user->set('age', 25); + $user->set('thisIsNull', null); + + // use magic methods to set document properties + $user->likes = ['fishing', 'hiking', 'swimming']; + + // send the document to the server + $id = $handler->save('users', $user); + + // check if a document exists + $result = $handler->has('users', $id); + var_dump($result); + + // print the document id created by the server + var_dump($id); + var_dump($user->getId()); + + + // get the document back from the server + $userFromServer = $handler->get('users', $id); + var_dump($userFromServer); + + // get a document list back from the server, using a document example + $cursor = $collectionHandler->byExample('users', ['name' => 'John']); + var_dump($cursor->getAll()); + + + // update a document + $userFromServer->likes = ['fishing', 'swimming']; + $userFromServer->state = 'CA'; + + $result = $handler->update($userFromServer); + var_dump($result); + + $userFromServer = $handler->get('users', $id); + var_dump($userFromServer); + + + // update a document removing an attribute, + // The 'keepNull'=>false option will cause ArangoDB to + // remove all attributes in the document, + // that have null as their value - not only the ones defined here + + $userFromServer->likes = ['fishing', 'swimming']; + $userFromServer->state = 'CA'; + $userFromServer->age = null; + + $result = $handler->update($userFromServer, ['keepNull' => false]); + var_dump($result); + + $userFromServer = $handler->get('users', $id); + var_dump($userFromServer); + + + // replace a document (notice that we are using the previously fetched document) + // In this example we are removing the state attribute + unset($userFromServer->state); + + $result = $handler->replace($userFromServer); + var_dump($result); + + $userFromServer = $handler->get('users', $id); + var_dump($userFromServer); + + + // replace a document, identified by collection and document id + $user = new ArangoDocument(); + $user->name = 'John'; + $user->likes = ['Running', 'Rowing']; + $userFromServer->state = 'CA'; + + // Notice that for the example we're getting the existing + // document id via a method call. Normally we would use the known id + $result = $handler->replaceById('users', $userFromServer->getId(), $user); + var_dump($result); + + $userFromServer = $handler->get('users', $id); + var_dump($userFromServer); + + + // remove a document on the server + $result = $handler->remove($userFromServer); + var_dump($result); + + + // remove a document on the server, using a collection id and document id + // In this example, we are using the id of the document we deleted in the previous example, + // so it will throw an exception here. (we are catching it though, in order to continue) + + try { + $result = $handler->removeById('users', $userFromServer->getId()); + } catch (\ArangoDBClient\ServerException $e) { + $e->getMessage(); + } + + + + // create a statement to insert 1000 test users + $statement = new ArangoStatement( + $connection, [ + 'query' => 'FOR i IN 1..1000 INSERT { _key: CONCAT("test", i) } IN users' + ] + ); + + // execute the statement + $cursor = $statement->execute(); + + + // now run another query on the data, using bind parameters + $statement = new ArangoStatement( + $connection, [ + 'query' => 'FOR u IN @@collection FILTER u.name == @name RETURN u', + 'bindVars' => [ + '@collection' => 'users', + 'name' => 'John' + ] + ] + ); + + // executing the statement returns a cursor + $cursor = $statement->execute(); + + // easiest way to get all results returned by the cursor + var_dump($cursor->getAll()); + + // to get statistics for the query, use Cursor::getExtra(); + var_dump($cursor->getExtra()); + + + $exampleCollection = new ArangoCollection(); + $exampleCollection->setName('example'); + $id = $collectionHandler->create($exampleCollection); + + // create a statement to insert 100 example documents + $statement = new ArangoStatement( + $connection, [ + 'query' => 'FOR i IN 1..100 INSERT { _key: CONCAT("example", i), value: i } IN example' + ] + ); + $statement->execute(); + + // later on, we can assemble a list of document keys + $keys = []; + for ($i = 1; $i <= 100; ++$i) { + $keys[] = 'example' . $i; + } + // and fetch all the documents at once + $documents = $collectionHandler->lookupByKeys('example', $keys); + var_dump($documents); + + // we can also bulk-remove them: + $result = $collectionHandler->removeByKeys('example', $keys); + + var_dump($result); + + + // drop a collection on the server, using its name, + $result = $collectionHandler->drop('users'); + var_dump($result); + + // drop the other one we created, too + $collectionHandler->drop('example'); +} catch (ArangoConnectException $e) { + print 'Connection error: ' . $e->getMessage() . PHP_EOL; +} catch (ArangoClientException $e) { + print 'Client error: ' . $e->getMessage() . PHP_EOL; +} catch (ArangoServerException $e) { + print 'Server error: ' . $e->getServerCode() . ': ' . $e->getServerMessage() . ' - ' . $e->getMessage() . PHP_EOL; +} +``` + +## More information - More example code, containing some code to create, delete and rename - collections, is provided in the [examples](examples) subdirectory that is + collections, is provided in the [`examples`](examples) subdirectory that is provided with the library. - [PHPDoc documentation](http://arangodb.github.io/arangodb-php/) for the complete library - -- [Follow us on Twitter](https://twitter.com/arangodbphp) - [@arangodbphp](https://twitter.com/arangodbphp) - to receive updates on the PHP driver