From fd1019c51e89c6bbeb83381531c83990de6f2805 Mon Sep 17 00:00:00 2001 From: Simran Date: Mon, 1 Oct 2018 18:12:56 +0200 Subject: [PATCH] Doc - Sync external repos 2018-09-26 (#6476) --- .../Drivers/GO/ConnectionManagement/README.md | 2 +- .../Drivers/GO/ExampleRequests/README.md | 2 +- .../Books/Drivers/GO/GettingStarted/README.md | 2 +- Documentation/Books/Drivers/GO/README.md | 2 +- .../Books/Drivers/JS/GettingStarted/README.md | 83 +++---- Documentation/Books/Drivers/JS/README.md | 8 +- .../JS/Reference/Collection/BulkImport.md | 174 ++++++++----- .../Collection/CollectionManipulation.md | 21 +- .../Collection/DocumentCollection.md | 6 +- .../Collection/DocumentManipulation.md | 171 ++++++------- .../JS/Reference/Collection/EdgeCollection.md | 8 +- .../JS/Reference/Collection/Indexes.md | 135 +++++----- .../Drivers/JS/Reference/Collection/README.md | 10 +- .../JS/Reference/Collection/SimpleQueries.md | 90 +++---- .../Books/Drivers/JS/Reference/Cursor.md | 4 +- .../JS/Reference/Database/AqlUserFunctions.md | 2 +- .../JS/Reference/Database/CollectionAccess.md | 2 +- .../Database/DatabaseManipulation.md | 129 +--------- .../JS/Reference/Database/FoxxServices.md | 230 +++++++++--------- .../JS/Reference/Database/GraphAccess.md | 2 +- .../JS/Reference/Database/HttpRoutes.md | 2 +- .../Drivers/JS/Reference/Database/Queries.md | 13 +- .../Drivers/JS/Reference/Database/README.md | 156 ++++++++++-- .../JS/Reference/Database/Transactions.md | 57 +++-- .../JS/Reference/Database/ViewAccess.md | 21 +- .../JS/Reference/Graph/EdgeCollection.md | 2 +- .../Books/Drivers/JS/Reference/Graph/Edges.md | 2 +- .../Drivers/JS/Reference/Graph/README.md | 2 +- .../JS/Reference/Graph/VertexCollection.md | 2 +- .../Drivers/JS/Reference/Graph/Vertices.md | 2 +- .../Books/Drivers/JS/Reference/README.md | 2 +- .../Books/Drivers/JS/Reference/Route.md | 2 +- .../Drivers/JS/Reference/ViewManipulation.md | 84 +++++-- .../Drivers/Java/GettingStarted/README.md | 5 +- Documentation/Books/Drivers/Java/README.md | 2 +- .../Java/Reference/Collection/BulkImport.md | 2 +- .../Collection/CollectionManipulation.md | 10 +- .../Collection/DocumentManipulation.md | 2 +- .../Java/Reference/Collection/Indexes.md | 2 +- .../Java/Reference/Collection/README.md | 12 +- .../Books/Drivers/Java/Reference/Cursor.md | 2 +- .../Reference/Database/AqlUserFunctions.md | 2 +- .../Reference/Database/CollectionAccess.md | 2 +- .../Database/DatabaseManipulation.md | 2 +- .../Java/Reference/Database/GraphAccess.md | 2 +- .../Java/Reference/Database/HttpRoutes.md | 2 +- .../Java/Reference/Database/Queries.md | 4 +- .../Drivers/Java/Reference/Database/README.md | 2 +- .../Java/Reference/Database/Transactions.md | 2 +- .../Java/Reference/Database/ViewAccess.md | 4 +- .../Java/Reference/Graph/EdgeCollection.md | 2 +- .../Drivers/Java/Reference/Graph/Edges.md | 2 +- .../Drivers/Java/Reference/Graph/README.md | 2 +- .../Java/Reference/Graph/VertexCollection.md | 2 +- .../Drivers/Java/Reference/Graph/Vertices.md | 2 +- .../Books/Drivers/Java/Reference/README.md | 2 +- .../Books/Drivers/Java/Reference/Route.md | 2 +- .../Drivers/Java/Reference/Serialization.md | 2 +- .../Books/Drivers/Java/Reference/Setup.md | 12 +- .../Java/Reference/View/ArangoSearch.md | 116 +++++---- .../Drivers/Java/Reference/View/README.md | 6 +- .../Java/Reference/View/ViewManipulation.md | 4 +- .../Drivers/PHP/GettingStarted/README.md | 2 +- Documentation/Books/Drivers/PHP/README.md | 2 +- .../Books/Drivers/PHP/Tutorial/README.md | 2 +- Documentation/Books/Drivers/SUMMARY.md | 15 +- .../SparkConnector/GettingStarted/README.md | 3 +- .../Books/Drivers/SparkConnector/README.md | 2 +- .../Drivers/SparkConnector/Reference/Java.md | 2 +- .../SparkConnector/Reference/README.md | 2 +- .../Drivers/SparkConnector/Reference/Scala.md | 2 +- .../SpringData/GettingStarted/README.md | 4 +- .../SpringData/Migration/Migrating-1.x-3.0.md | 4 +- .../SpringData/Migration/Migrating-2.x-3.0.md | 2 +- .../Drivers/SpringData/Migration/README.md | 2 +- .../Books/Drivers/SpringData/README.md | 2 +- .../SpringData/Reference/Mapping/Auditing.md | 78 ++++++ .../SpringData/Reference/Mapping/Converter.md | 2 +- .../SpringData/Reference/Mapping/Document.md | 2 +- .../SpringData/Reference/Mapping/Edge.md | 2 +- .../SpringData/Reference/Mapping/Events.md | 2 +- .../SpringData/Reference/Mapping/Indexes.md | 2 +- .../SpringData/Reference/Mapping/README.md | 2 +- .../SpringData/Reference/Mapping/Reference.md | 2 +- .../SpringData/Reference/Mapping/Relations.md | 2 +- .../Drivers/SpringData/Reference/README.md | 3 +- .../Repositories/DocumentManipulation.md | 2 +- .../Repositories/MultiDocumentManipulation.md | 2 +- .../Repositories/Queries/DerivedQueries.md | 2 +- .../Repositories/Queries/NamedQueries.md | 2 +- .../Repositories/Queries/QueryMethods.md | 2 +- .../Reference/Repositories/Queries/README.md | 2 +- .../Reference/Repositories/QueryByExample.md | 2 +- .../Reference/Repositories/README.md | 2 +- .../Template/CollectionManipulation.md | 2 +- .../Template/DocumentManipulation.md | 2 +- .../Template/MultiDocumentManipulation.md | 2 +- .../SpringData/Reference/Template/Queries.md | 4 +- .../SpringData/Reference/Template/README.md | 2 +- .../Manual/Administration/DC2DC/README.md | 14 +- .../Manual/Administration/Starter/README.md | 2 +- .../Manual/Administration/Starter/Recovery.md | 2 +- .../Manual/Administration/Starter/Removal.md | 2 +- .../DeploymentModes/DC2DC/Applicability.md | 2 +- .../DeploymentModes/DC2DC/Introduction.md | 2 +- .../DeploymentModes/DC2DC/Limitations.md | 2 +- .../DeploymentModes/DC2DC/README.md | 2 +- .../DeploymentModes/DC2DC/Requirements.md | 5 +- .../ActiveFailover/UsingTheStarter.md | 2 +- .../Deployment/ArangoDBStarter/README.md | 2 +- .../Deployment/Cluster/UsingTheStarter.md | 2 +- .../Deployment/DC2DC/ArangoSyncMaster.md | 2 +- .../Deployment/DC2DC/ArangoSyncWorkers.md | 2 +- .../Books/Manual/Deployment/DC2DC/Cluster.md | 2 +- .../Manual/Deployment/DC2DC/KafkaZookeeper.md | 2 +- .../Deployment/DC2DC/PrometheusGrafana.md | 2 +- .../Books/Manual/Deployment/DC2DC/README.md | 2 +- .../Deployment/Kubernetes/Authentication.md | 2 +- .../Deployment/Kubernetes/ConfigAndSecrets.md | 2 +- .../Deployment/Kubernetes/Dashboards.md | 74 ++++++ .../DeploymentReplicationResource.md | 2 +- .../Kubernetes/DeploymentResource.md | 2 +- .../Kubernetes/DriverConfiguration.md | 2 +- .../Manual/Deployment/Kubernetes/Helm.md | 92 +++++++ .../Manual/Deployment/Kubernetes/Metrics.md | 2 +- .../Manual/Deployment/Kubernetes/README.md | 4 +- .../Manual/Deployment/Kubernetes/Scaling.md | 2 +- .../Kubernetes/ServicesAndLoadBalancer.md | 2 +- .../Manual/Deployment/Kubernetes/Storage.md | 2 +- .../Deployment/Kubernetes/StorageResource.md | 2 +- .../Books/Manual/Deployment/Kubernetes/Tls.md | 2 +- .../Deployment/Kubernetes/Troubleshooting.md | 2 +- .../Manual/Deployment/Kubernetes/Upgrading.md | 4 +- .../Manual/Deployment/Kubernetes/Usage.md | 45 +++- .../SingleInstance/UsingTheStarter.md | 2 +- .../Books/Manual/Monitoring/DC2DC/README.md | 2 +- .../Books/Manual/Programs/FoxxCLI/Details.md | 2 +- .../Books/Manual/Programs/FoxxCLI/README.md | 2 +- .../Manual/Programs/Starter/Architecture.md | 2 +- .../Books/Manual/Programs/Starter/Options.md | 2 +- .../Books/Manual/Programs/Starter/README.md | 2 +- .../Books/Manual/Programs/Starter/Security.md | 2 +- Documentation/Books/Manual/SUMMARY.md | 31 +-- .../Books/Manual/Security/DC2DC/README.md | 2 +- .../Books/Manual/Security/Starter/README.md | 2 +- .../Manual/Troubleshooting/DC2DC/README.md | 2 +- .../Books/Manual/Tutorials/DC2DC/README.md | 13 +- .../Manual/Tutorials/Kubernetes/DC2DC.md | 2 +- .../Books/Manual/Tutorials/Kubernetes/GKE.md | 120 +++++++++ .../Manual/Tutorials/Kubernetes/README.md | 3 +- .../Kubernetes/gke-clusters-added.png | Bin 0 -> 52380 bytes .../Kubernetes/gke-clusters-ready.png | Bin 0 -> 53732 bytes .../Tutorials/Kubernetes/gke-clusters.png | Bin 0 -> 49759 bytes .../Kubernetes/gke-connect-to-cluster.png | Bin 0 -> 48809 bytes .../Kubernetes/gke-create-cluster.png | Bin 0 -> 76316 bytes .../Tutorials/Kubernetes/gke-edit-cluster.png | Bin 0 -> 53759 bytes .../Kubernetes/gke-show-credentials.png | Bin 0 -> 30419 bytes .../Books/Manual/Tutorials/Starter/README.md | 2 +- Documentation/Scripts/fetchRefs.sh | 42 ++-- 159 files changed, 1454 insertions(+), 889 deletions(-) create mode 100644 Documentation/Books/Drivers/SpringData/Reference/Mapping/Auditing.md create mode 100644 Documentation/Books/Manual/Deployment/Kubernetes/Dashboards.md create mode 100644 Documentation/Books/Manual/Deployment/Kubernetes/Helm.md create mode 100644 Documentation/Books/Manual/Tutorials/Kubernetes/GKE.md create mode 100644 Documentation/Books/Manual/Tutorials/Kubernetes/gke-clusters-added.png create mode 100644 Documentation/Books/Manual/Tutorials/Kubernetes/gke-clusters-ready.png create mode 100644 Documentation/Books/Manual/Tutorials/Kubernetes/gke-clusters.png create mode 100644 Documentation/Books/Manual/Tutorials/Kubernetes/gke-connect-to-cluster.png create mode 100644 Documentation/Books/Manual/Tutorials/Kubernetes/gke-create-cluster.png create mode 100644 Documentation/Books/Manual/Tutorials/Kubernetes/gke-edit-cluster.png create mode 100644 Documentation/Books/Manual/Tutorials/Kubernetes/gke-show-credentials.png diff --git a/Documentation/Books/Drivers/GO/ConnectionManagement/README.md b/Documentation/Books/Drivers/GO/ConnectionManagement/README.md index 08b2dd150c..67de1a7218 100644 --- a/Documentation/Books/Drivers/GO/ConnectionManagement/README.md +++ b/Documentation/Books/Drivers/GO/ConnectionManagement/README.md @@ -1,4 +1,4 @@ - + # ArangoDB GO Driver - Connection Management ## Failover diff --git a/Documentation/Books/Drivers/GO/ExampleRequests/README.md b/Documentation/Books/Drivers/GO/ExampleRequests/README.md index 632bfc8dbf..9bc9909658 100644 --- a/Documentation/Books/Drivers/GO/ExampleRequests/README.md +++ b/Documentation/Books/Drivers/GO/ExampleRequests/README.md @@ -1,4 +1,4 @@ - + # ArangoDB GO Driver - Example requests ## Connecting to ArangoDB diff --git a/Documentation/Books/Drivers/GO/GettingStarted/README.md b/Documentation/Books/Drivers/GO/GettingStarted/README.md index c9637deb97..cfc6ec990d 100644 --- a/Documentation/Books/Drivers/GO/GettingStarted/README.md +++ b/Documentation/Books/Drivers/GO/GettingStarted/README.md @@ -1,4 +1,4 @@ - + # ArangoDB GO Driver - Getting Started ## Supported versions diff --git a/Documentation/Books/Drivers/GO/README.md b/Documentation/Books/Drivers/GO/README.md index 178c78f01c..4701bd6c6e 100644 --- a/Documentation/Books/Drivers/GO/README.md +++ b/Documentation/Books/Drivers/GO/README.md @@ -1,4 +1,4 @@ - + # ArangoDB GO Driver The official [ArangoDB](https://arangodb.com) GO Driver diff --git a/Documentation/Books/Drivers/JS/GettingStarted/README.md b/Documentation/Books/Drivers/JS/GettingStarted/README.md index fb27cb73e9..6eedb3f88c 100644 --- a/Documentation/Books/Drivers/JS/GettingStarted/README.md +++ b/Documentation/Books/Drivers/JS/GettingStarted/README.md @@ -1,12 +1,17 @@ - + # ArangoDB JavaScript Driver - Getting Started ## Compatibility -ArangoJS is compatible with ArangoDB 3.0 and later. **For using ArangoJS with -2.8 or earlier see the upgrade note below.** ArangoJS is tested against the two -most-recent releases of ArangoDB 3 (currently 3.2 and 3.3) as well as the most -recent version of 2.8 and the latest development version. +ArangoJS is compatible with the latest stable version of ArangoDB available at +the time of the driver release. + +The [_arangoVersion_ option](../Reference/Database/README.md) +can be used to tell arangojs to target a specific +ArangoDB version. Depending on the version this will enable or disable certain +methods and change behavior to maintain compatibility with the given version. +The oldest version of ArangoDB supported by arangojs when using this option +is 2.8.0 (using `arangoVersion: 20800`). The yarn/npm distribution of ArangoJS is compatible with Node.js versions 9.x (latest), 8.x (LTS) and 6.x (LTS). Node.js version support follows @@ -17,16 +22,10 @@ versions of all modern browsers (Edge, Chrome, Firefox and Safari). Versions outside this range may be compatible but are not actively supported. -**Upgrade note**: If you want to use arangojs with ArangoDB 2.8 or earlier -remember to set the appropriate `arangoVersion` option (e.g. `20800` for version -2.8.0). The current default value is `30000` (indicating compatibility with -version 3.0.0 and newer). **The driver will behave differently depending on this -value when using APIs that have changed between these versions.** - -**Upgrade note for 6.0.0**: All asynchronous functions now return promises and -support for node-style callbacks has been removed. If you are using a version of -Node.js older than Node.js 6.x LTS ("Boron") make sure you replace the native -`Promise` implementation with a substitute like [bluebird](https://github.com/petkaantonov/bluebird) +**Note**: Starting with arangojs 6.0.0, all asynchronous functions return +promises. If you are using a version of Node.js older than Node.js 6.x LTS +("Boron") make sure you replace the native `Promise` implementation with a +substitute like [bluebird](https://github.com/petkaantonov/bluebird) to avoid a known memory leak in older versions of the V8 JavaScript engine. ## Versions @@ -35,11 +34,11 @@ The version number of this driver does not indicate supported ArangoDB versions! This driver uses semantic versioning: -* A change in the bugfix version (e.g. X.Y.0 -> X.Y.1) indicates internal +- A change in the bugfix version (e.g. X.Y.0 -> X.Y.1) indicates internal changes and should always be safe to upgrade. -* A change in the minor version (e.g. X.1.Z -> X.2.0) indicates additions and +- A change in the minor version (e.g. X.1.Z -> X.2.0) indicates additions and backwards-compatible changes that should not affect your code. -* A change in the major version (e.g. 1.Y.Z -> 2.0.0) indicates _breaking_ +- A change in the major version (e.g. 1.Y.Z -> 2.0.0) indicates _breaking_ changes that require changes in your code to upgrade. If you are getting weird errors or functions seem to be missing, make sure you @@ -59,27 +58,6 @@ You can find the documentation for each version by clicking on the corresponding date on the left in [the list of version tags](https://github.com/arangodb/arangojs/tags). -## Testing - -Run the tests using the `yarn test` or `npm test` commands: - -```sh -yarn test -# - or - -npm test -``` - -By default the tests will be run against a server listening on -`http://localhost:8529` (using username `root` with no password). To -override this, you can set the environment variable `TEST_ARANGODB_URL` to -something different: - -```sh -TEST_ARANGODB_URL=http://myserver.local:8530 yarn test -# - or - -TEST_ARANGODB_URL=http://myserver.local:8530 npm test -``` - ## Install ### With Yarn or NPM @@ -171,11 +149,10 @@ const db = new Database(); var arangojs = require("arangojs"); var db = new arangojs.Database(); var now = Date.now(); -db - .query({ - query: "RETURN @value", - bindVars: { value: now } - }) +db.query({ + query: "RETURN @value", + bindVars: { value: now } +}) .then(function(cursor) { return cursor.next().then(function(result) { // ... @@ -213,7 +190,9 @@ AQL queries without making your code vulnerable to injection attacks. ## Error responses If arangojs encounters an API error, it will throw an _ArangoError_ with an -[_errorNum_ as defined in the ArangoDB documentation](../../..//Manual/Appendix/ErrorCodes.html) as well as a _code_ and _statusCode_ property indicating the intended and actual HTTP status code of the response. +[_errorNum_ error code](../../..//Manual/Appendix/ErrorCodes.html) +as well as a _code_ and _statusCode_ property indicating the intended and +actual HTTP status code of the response. For any other error responses (4xx/5xx status code), it will throw an _HttpError_ error with the status code indicated by the _code_ and _statusCode_ properties. @@ -224,22 +203,22 @@ not be parsed, a _SyntaxError_ may be thrown instead. In all of these cases the error object will additionally have a _response_ property containing the server response object. -If the request failed at a network level or the connection was closed without receiving a response, the underlying error will be thrown instead. +If the request failed at a network level or the connection was closed without +receiving a response, the underlying error will be thrown instead. **Examples** ```js // Using async/await try { - const info = await db.createDatabase('mydb'); + const info = await db.createDatabase("mydb"); // database created } catch (err) { console.error(err.stack); } // Using promises with arrow functions -db.createDatabase('mydb') -.then( +db.createDatabase("mydb").then( info => { // database created }, @@ -247,7 +226,9 @@ db.createDatabase('mydb') ); ``` -**Note**: the examples in the remainder of this documentation use async/await +{% hint 'tip' %} +The examples in the remainder of this documentation use `async`/`await` and other modern language features like multi-line strings and template tags. When developing for an environment without support for these language features, -just use promises instead as in the above example. +substitute promises for `await` syntax as in the above example. +{% endhint %} diff --git a/Documentation/Books/Drivers/JS/README.md b/Documentation/Books/Drivers/JS/README.md index 1c918eb604..c4f95ae9c3 100644 --- a/Documentation/Books/Drivers/JS/README.md +++ b/Documentation/Books/Drivers/JS/README.md @@ -1,4 +1,4 @@ - + # ArangoDB JavaScript Driver The official ArangoDB low-level JavaScript client. @@ -11,6 +11,6 @@ instead; specifically the `db` object exported by the `@arangodb` module. The JavaScript driver is **only** meant to be used when accessing ArangoDB from **outside** the database. -* [Getting Started](GettingStarted/README.md) -* [Reference](Reference/README.md) -* [Changelog](https://github.com/arangodb/arangojs/blob/master/CHANGELOG.md#readme) +- [Getting Started](GettingStarted/README.md) +- [Reference](Reference/README.md) +- [Changelog](https://github.com/arangodb/arangojs/blob/master/CHANGELOG.md#readme) diff --git a/Documentation/Books/Drivers/JS/Reference/Collection/BulkImport.md b/Documentation/Books/Drivers/JS/Reference/Collection/BulkImport.md index 7a2cdd8ce6..70aafed31c 100644 --- a/Documentation/Books/Drivers/JS/Reference/Collection/BulkImport.md +++ b/Documentation/Books/Drivers/JS/Reference/Collection/BulkImport.md @@ -1,4 +1,4 @@ - + # Bulk importing documents This function implements the @@ -12,90 +12,140 @@ Bulk imports the given _data_ into the collection. **Arguments** -* **data**: `Array> | Array` +- **data**: `Array | Buffer | string` - The data to import. This can be an array of documents: + The data to import. Depending on the _type_ option this can be any of the + following: - ```js - [ - {key1: value1, key2: value2}, // document 1 - {key1: value1, key2: value2}, // document 2 - ... - ] - ``` + For type `"documents"` or `"auto"`: - Or it can be an array of value arrays following an array of keys. + - an array of documents, e.g. - ```js - [ - ['key1', 'key2'], // key names - [value1, value2], // document 1 - [value1, value2], // document 2 - ... - ] - ``` + ```json + [ + { "_key": "banana", "color": "yellow" }, + { "_key": "peach", "color": "pink" } + ] + ``` -* **opts**: `Object` (optional) If _opts_ is set, it must be an object with any + - a string or buffer containing one JSON document per line, e.g. + + ``` + {"_key":"banana","color":"yellow"} + {"_key":"peach","color":"pink"} + ``` + + For type `"array"` or `"auto"`: + + - a string or buffer containing a JSON array of documents, e.g. + + ```json + [ + { "_key": "banana", "color": "yellow" }, + { "_key": "peach", "color": "pink" } + ] + ``` + + For type `null`: + + - an array containing an array of keys followed by arrays of values, e.g. + + ``` + [ + ["_key", "color"], + ["banana", "yellow"], + ["peach", "pink"] + ] + ``` + + - a string or buffer containing a JSON array of keys followed by + one JSON array of values per line, e.g. + + ``` + ["_key", "color"] + ["banana", "yellow"] + ["peach", "pink"] + ``` + +- **opts**: `Object` (optional) If _opts_ is set, it must be an object with any of the following properties: - * **waitForSync**: `boolean` (Default: `false`) + - **type**: `string | null` (Default: `"auto"`) + + Indicates which format the data uses. + Can be `"documents"`, `"array"` or `"auto"`. + Use `null` to explicitly set no type. + + - **fromPrefix**: `string` (optional) + + Prefix to prepend to `_from` attributes. + + - **toPrefix**: `string` (optional) + + Prefix to prepend to `_to` attributes. + + - **overwrite**: `boolean` (Default: `false`) + + If set to `true`, the collection is truncated before the data is imported. + + - **waitForSync**: `boolean` (Default: `false`) Wait until the documents have been synced to disk. - * **details**: `boolean` (Default: `false`) + - **onDuplicate**: `string` (Default: `"error"`) + + Controls behavior when a unique constraint is violated. + Can be `"error"`, `"update"`, `"replace"` or `"ignore"`. + + - **complete**: `boolean` (Default: `false`) + + If set to `true`, the import will abort if any error occurs. + + - **details**: `boolean` (Default: `false`) Whether the response should contain additional details about documents that - could not be imported.false\*. + could not be imported. - * **type**: `string` (Default: `"auto"`) - - Indicates which format the data uses. Can be `"documents"`, `"array"` or - `"auto"`. - -If _data_ is a JavaScript array, it will be transmitted as a line-delimited JSON -stream. If _opts.type_ is set to `"array"`, it will be transmitted as regular -JSON instead. If _data_ is a string, it will be transmitted as it is without any -processing. - -For more information on the _opts_ object, see -[the HTTP API documentation for bulk imports](../../../..//HTTP/BulkImports/ImportingSelfContained.html). +For more information on the _opts_ object, see the +[HTTP API documentation for bulk imports](../../../..//HTTP/BulkImports/index.html). **Examples** ```js const db = new Database(); -const collection = db.collection('users'); +const collection = db.collection("users"); -// document stream -const result = await collection.import([ - {username: 'admin', password: 'hunter2'}, - {username: 'jcd', password: 'bionicman'}, - {username: 'jreyes', password: 'amigo'}, - {username: 'ghermann', password: 'zeitgeist'} -]); -assert.equal(result.created, 4); +const result = await collection.import( + [ + { username: "jcd", password: "bionicman" }, + { username: "jreyes", password: "amigo" }, + { username: "ghermann", password: "zeitgeist" } + ], + { type: "documents" } // optional +); // -- or -- -// array stream with header -const result = await collection.import([ - ['username', 'password'], // keys - ['admin', 'hunter2'], // row 1 - ['jcd', 'bionicman'], // row 2 - ['jreyes', 'amigo'], - ['ghermann', 'zeitgeist'] -]); -assert.equal(result.created, 4); +const buf = fs.readFileSync("dx_users.json"); +// [ +// {"username": "jcd", "password": "bionicman"}, +// {"username": "jreyes", "password": "amigo"}, +// {"username": "ghermann", "password": "zeitgeist"} +// ] +const result = await collection.import( + buf, + { type: "array" } // optional +); // -- or -- -// raw line-delimited JSON array stream with header -const result = await collection.import([ - '["username", "password"]', - '["admin", "hunter2"]', - '["jcd", "bionicman"]', - '["jreyes", "amigo"]', - '["ghermann", "zeitgeist"]' -].join('\r\n') + '\r\n'); -assert.equal(result.created, 4); +const result = await collection.import( + [ + ["username", "password"], + ["jcd", "bionicman"], + ["jreyes", "amigo"], + ["ghermann", "zeitgeist"] + ], + { type: null } // required +); ``` diff --git a/Documentation/Books/Drivers/JS/Reference/Collection/CollectionManipulation.md b/Documentation/Books/Drivers/JS/Reference/Collection/CollectionManipulation.md index ff44bced0c..f06c6a15a9 100644 --- a/Documentation/Books/Drivers/JS/Reference/Collection/CollectionManipulation.md +++ b/Documentation/Books/Drivers/JS/Reference/Collection/CollectionManipulation.md @@ -1,8 +1,8 @@ - + # Manipulating the collection -These functions implement -[the HTTP API for modifying collections](../../../..//HTTP/Collection/Modifying.html). +These functions implement the +[HTTP API for modifying collections](../../../..//HTTP/Collection/Modifying.html). ## collection.create @@ -15,8 +15,8 @@ then returns the server response. - **properties**: `Object` (optional) - For more information on the _properties_ object, see - [the HTTP API documentation for creating collections](../../../..//HTTP/Collection/Creating.html). + For more information on the _properties_ object, see the + [HTTP API documentation for creating collections](../../../..//HTTP/Collection/Creating.html). **Examples** @@ -82,8 +82,8 @@ Replaces the properties of the collection. - **properties**: `Object` - For information on the _properties_ argument see - [the HTTP API for modifying collections](../../../..//HTTP/Collection/Modifying.html). + For information on the _properties_ argument see the + [HTTP API for modifying collections](../../../..//HTTP/Collection/Modifying.html). **Examples** @@ -162,9 +162,10 @@ Deletes the collection from the database. This parameter must be set to `true` when dropping a system collection. - For more information on the _properties_ object, see - [the HTTP API documentation for dropping collections](../../../..//HTTP/Collection/Creating.html#drops-a-collection). - **Examples** + For more information on the _properties_ object, see the + [HTTP API documentation for dropping collections](../../../..//HTTP/Collection/Creating.html#drops-a-collection). + +**Examples** ```js const db = new Database(); diff --git a/Documentation/Books/Drivers/JS/Reference/Collection/DocumentCollection.md b/Documentation/Books/Drivers/JS/Reference/Collection/DocumentCollection.md index b36068509c..713f590740 100644 --- a/Documentation/Books/Drivers/JS/Reference/Collection/DocumentCollection.md +++ b/Documentation/Books/Drivers/JS/Reference/Collection/DocumentCollection.md @@ -1,4 +1,4 @@ - + # DocumentCollection API The _DocumentCollection API_ extends the @@ -131,8 +131,8 @@ the document's metadata. If a boolean is passed instead of an options object, it will be interpreted as the _returnNew_ option. -For more information on the _opts_ object, see -[the HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). +For more information on the _opts_ object, see the +[HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). **Examples** diff --git a/Documentation/Books/Drivers/JS/Reference/Collection/DocumentManipulation.md b/Documentation/Books/Drivers/JS/Reference/Collection/DocumentManipulation.md index 2fe2e03b62..a0f5bb204b 100644 --- a/Documentation/Books/Drivers/JS/Reference/Collection/DocumentManipulation.md +++ b/Documentation/Books/Drivers/JS/Reference/Collection/DocumentManipulation.md @@ -1,4 +1,4 @@ - + # Manipulating documents These functions implement the @@ -11,56 +11,57 @@ These functions implement the Replaces the content of the document with the given _documentHandle_ with the given _newValue_ and returns an object containing the document's metadata. -**Note**: The _policy_ option is not available when using the driver with -ArangoDB 3.0 as it is redundant when specifying the _rev_ option. - **Arguments** -* **documentHandle**: `string` +- **documentHandle**: `string` The handle of the document to replace. This can either be the `_id` or the `_key` of a document in the collection, or a document (i.e. an object with an `_id` or `_key` property). -* **newValue**: `Object` +- **newValue**: `Object` The new data of the document. -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) If _opts_ is set, it must be an object with any of the following properties: - * **waitForSync**: `boolean` (Default: `false`) + - **waitForSync**: `boolean` (Default: `false`) Wait until the document has been synced to disk. Default: `false`. - * **rev**: `string` (optional) + - **rev**: `string` (optional) Only replace the document if it matches this revision. - * **policy**: `string` (optional) + - **policy**: `string` (optional) - Determines the behaviour when the revision is not matched: + {% hint 'warning' %} + This option has no effect in ArangoDB 3.0 and later. + {% endhint %} - * if _policy_ is set to `"last"`, the document will be replaced regardless + Determines the behavior when the revision is not matched: + + - if _policy_ is set to `"last"`, the document will be replaced regardless of the revision. - * if _policy_ is set to `"error"` or not set, the replacement will fail with + - if _policy_ is set to `"error"` or not set, the replacement will fail with an error. If a string is passed instead of an options object, it will be interpreted as the _rev_ option. -For more information on the _opts_ object, see -[the HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). +For more information on the _opts_ object, see the +[HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). **Examples** ```js const db = new Database(); -const collection = db.collection('some-collection'); -const data = {number: 1, hello: 'world'}; +const collection = db.collection("some-collection"); +const data = { number: 1, hello: "world" }; const info1 = await collection.save(data); -const info2 = await collection.replace(info1, {number: 2}); +const info2 = await collection.replace(info1, { number: 2 }); assert.equal(info2._id, info1._id); assert.notEqual(info2._rev, info1._rev); const doc = await collection.document(info1); @@ -78,83 +79,84 @@ Updates (merges) the content of the document with the given _documentHandle_ with the given _newValue_ and returns an object containing the document's metadata. -**Note**: The _policy_ option is not available when using the driver with -ArangoDB 3.0 as it is redundant when specifying the _rev_ option. - **Arguments** -* **documentHandle**: `string` +- **documentHandle**: `string` Handle of the document to update. This can be either the `_id` or the `_key` of a document in the collection, or a document (i.e. an object with an `_id` or `_key` property). -* **newValue**: `Object` +- **newValue**: `Object` The new data of the document. -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) If _opts_ is set, it must be an object with any of the following properties: - * **waitForSync**: `boolean` (Default: `false`) + - **waitForSync**: `boolean` (Default: `false`) Wait until document has been synced to disk. - * **keepNull**: `boolean` (Default: `true`) + - **keepNull**: `boolean` (Default: `true`) If set to `false`, properties with a value of `null` indicate that a property should be deleted. - * **mergeObjects**: `boolean` (Default: `true`) + - **mergeObjects**: `boolean` (Default: `true`) If set to `false`, object properties that already exist in the old document will be overwritten rather than merged. This does not affect arrays. - * **returnOld**: `boolean` (Default: `false`) + - **returnOld**: `boolean` (Default: `false`) If set to `true`, return additionally the complete previous revision of the changed documents under the attribute `old` in the result. - * **returnNew**: `boolean` (Default: `false`) + - **returnNew**: `boolean` (Default: `false`) If set to `true`, return additionally the complete new documents under the attribute `new` in the result. - * **ignoreRevs**: `boolean` (Default: `true`) + - **ignoreRevs**: `boolean` (Default: `true`) - By default, or if this is set to true, the _rev attributes in the given - documents are ignored. If this is set to false, then any _rev attribute + By default, or if this is set to true, the `_rev` attributes in the given + documents are ignored. If this is set to false, then any `_rev` attribute given in a body document is taken as a precondition. The document is only updated if the current revision is the one specified. - * **rev**: `string` (optional) + - **rev**: `string` (optional) Only update the document if it matches this revision. - * **policy**: `string` (optional) + - **policy**: `string` (optional) - Determines the behaviour when the revision is not matched: + {% hint 'warning' %} + This option has no effect in ArangoDB 3.0 and later. + {% endhint %} - * if _policy_ is set to `"last"`, the document will be replaced regardless + Determines the behavior when the revision is not matched: + + - if _policy_ is set to `"last"`, the document will be replaced regardless of the revision. - * if _policy_ is set to `"error"` or not set, the replacement will fail with + - if _policy_ is set to `"error"` or not set, the replacement will fail with an error. If a string is passed instead of an options object, it will be interpreted as the _rev_ option. -For more information on the _opts_ object, see -[the HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). +For more information on the _opts_ object, see the +[HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). **Examples** ```js const db = new Database(); -const collection = db.collection('some-collection'); -const doc = {number: 1, hello: 'world'}; +const collection = db.collection("some-collection"); +const doc = { number: 1, hello: "world" }; const doc1 = await collection.save(doc); -const doc2 = await collection.update(doc1, {number: 2}); +const doc2 = await collection.update(doc1, { number: 2 }); assert.equal(doc2._id, doc1._id); assert.notEqual(doc2._rev, doc1._rev); const doc3 = await collection.document(doc2); @@ -171,67 +173,69 @@ assert.equal(doc3.hello, doc.hello); Updates (merges) the content of the documents with the given _documents_ and returns an array containing the documents' metadata. -**Note**: This method is new in 3.0 and is available when using the driver with -ArangoDB 3.0 and higher. +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.0 or later, +see [Compatibility](../../GettingStarted/README.md#compatibility). +{% endhint %} **Arguments** -* **documents**: `Array` +- **documents**: `Array` Documents to update. Each object must have either the `_id` or the `_key` property. -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) If _opts_ is set, it must be an object with any of the following properties: - * **waitForSync**: `boolean` (Default: `false`) + - **waitForSync**: `boolean` (Default: `false`) Wait until document has been synced to disk. - * **keepNull**: `boolean` (Default: `true`) + - **keepNull**: `boolean` (Default: `true`) If set to `false`, properties with a value of `null` indicate that a property should be deleted. - * **mergeObjects**: `boolean` (Default: `true`) + - **mergeObjects**: `boolean` (Default: `true`) If set to `false`, object properties that already exist in the old document will be overwritten rather than merged. This does not affect arrays. - * **returnOld**: `boolean` (Default: `false`) + - **returnOld**: `boolean` (Default: `false`) If set to `true`, return additionally the complete previous revision of the changed documents under the attribute `old` in the result. - * **returnNew**: `boolean` (Default: `false`) + - **returnNew**: `boolean` (Default: `false`) If set to `true`, return additionally the complete new documents under the attribute `new` in the result. - * **ignoreRevs**: `boolean` (Default: `true`) + - **ignoreRevs**: `boolean` (Default: `true`) - By default, or if this is set to true, the _rev attributes in the given - documents are ignored. If this is set to false, then any _rev attribute + By default, or if this is set to true, the `_rev` attributes in the given + documents are ignored. If this is set to false, then any `_rev` attribute given in a body document is taken as a precondition. The document is only updated if the current revision is the one specified. -For more information on the _opts_ object, see -[the HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). +For more information on the _opts_ object, see the +[HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). **Examples** ```js const db = new Database(); -const collection = db.collection('some-collection'); -const doc1 = {number: 1, hello: 'world1'}; +const collection = db.collection("some-collection"); +const doc1 = { number: 1, hello: "world1" }; const info1 = await collection.save(doc1); -const doc2 = {number: 2, hello: 'world2'}; +const doc2 = { number: 2, hello: "world2" }; const info2 = await collection.save(doc2); -const result = await collection.bulkUpdate([ - {_key: info1._key, number: 3}, - {_key: info2._key, number: 4} -], {returnNew: true}) +const result = await collection.bulkUpdate( + [{ _key: info1._key, number: 3 }, { _key: info2._key, number: 4 }], + { returnNew: true } +); ``` ## collection.remove @@ -240,56 +244,57 @@ const result = await collection.bulkUpdate([ Deletes the document with the given _documentHandle_ from the collection. -**Note**: The _policy_ option is not available when using the driver with -ArangoDB 3.0 as it is redundant when specifying the _rev_ option. - **Arguments** -* **documentHandle**: `string` +- **documentHandle**: `string` The handle of the document to delete. This can be either the `_id` or the `_key` of a document in the collection, or a document (i.e. an object with an `_id` or `_key` property). -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) If _opts_ is set, it must be an object with any of the following properties: - * **waitForSync**: `boolean` (Default: `false`) + - **waitForSync**: `boolean` (Default: `false`) Wait until document has been synced to disk. - * **rev**: `string` (optional) + - **rev**: `string` (optional) Only update the document if it matches this revision. - * **policy**: `string` (optional) + - **policy**: `string` (optional) - Determines the behaviour when the revision is not matched: + {% hint 'warning' %} + This option has no effect in ArangoDB 3.0 and later. + {% endhint %} - * if _policy_ is set to `"last"`, the document will be replaced regardless + Determines the behavior when the revision is not matched: + + - if _policy_ is set to `"last"`, the document will be replaced regardless of the revision. - * if _policy_ is set to `"error"` or not set, the replacement will fail with + - if _policy_ is set to `"error"` or not set, the replacement will fail with an error. If a string is passed instead of an options object, it will be interpreted as the _rev_ option. -For more information on the _opts_ object, see -[the HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). +For more information on the _opts_ object, see the +[HTTP API documentation for working with documents](../../../..//HTTP/Document/WorkingWithDocuments.html). **Examples** ```js const db = new Database(); -const collection = db.collection('some-collection'); +const collection = db.collection("some-collection"); -await collection.remove('some-doc'); +await collection.remove("some-doc"); // document 'some-collection/some-doc' no longer exists // -- or -- -await collection.remove('some-collection/some-doc'); +await collection.remove("some-collection/some-doc"); // document 'some-collection/some-doc' no longer exists ``` @@ -301,13 +306,13 @@ Retrieves a list of references for all documents in the collection. **Arguments** -* **type**: `string` (Default: `"id"`) +- **type**: `string` (Default: `"id"`) The format of the document references: - * if _type_ is set to `"id"`, each reference will be the `_id` of the + - if _type_ is set to `"id"`, each reference will be the `_id` of the document. - * if _type_ is set to `"key"`, each reference will be the `_key` of the + - if _type_ is set to `"key"`, each reference will be the `_key` of the document. - * if _type_ is set to `"path"`, each reference will be the URI path of the + - if _type_ is set to `"path"`, each reference will be the URI path of the document. diff --git a/Documentation/Books/Drivers/JS/Reference/Collection/EdgeCollection.md b/Documentation/Books/Drivers/JS/Reference/Collection/EdgeCollection.md index e64bc06259..64c23a333e 100644 --- a/Documentation/Books/Drivers/JS/Reference/Collection/EdgeCollection.md +++ b/Documentation/Books/Drivers/JS/Reference/Collection/EdgeCollection.md @@ -1,4 +1,4 @@ - + # EdgeCollection API The _EdgeCollection API_ extends the @@ -79,7 +79,7 @@ if (exists === false) { ## edgeCollection.save -`async edgeCollection.save(data, [fromId, toId]): Object` +`async edgeCollection.save(data, [fromId, toId], [opts]): Object` Creates a new edge between the documents _fromId_ and _toId_ with the given _data_ and returns an object containing the edge's metadata. @@ -275,8 +275,8 @@ contained in this edge collection. - **opts**: `Object` - See - [the HTTP API documentation](../../../..//HTTP/Traversal/index.html) + See the + [HTTP API documentation](../../../..//HTTP/Traversal/index.html) for details on the additional arguments. Please note that while _opts.filter_, _opts.visitor_, _opts.init_, diff --git a/Documentation/Books/Drivers/JS/Reference/Collection/Indexes.md b/Documentation/Books/Drivers/JS/Reference/Collection/Indexes.md index 2fd1b49cb7..9cecf6e199 100644 --- a/Documentation/Books/Drivers/JS/Reference/Collection/Indexes.md +++ b/Documentation/Books/Drivers/JS/Reference/Collection/Indexes.md @@ -1,4 +1,4 @@ - + # Manipulating indexes These functions implement the @@ -12,17 +12,20 @@ Creates an arbitrary index on the collection. **Arguments** -* **details**: `Object` +- **details**: `Object` - For information on the possible properties of the _details_ object, see - [the HTTP API for manipulating indexes](../../../..//HTTP/Indexes/WorkingWith.html). + For information on the possible properties of the _details_ object, see the + [HTTP API for manipulating indexes](../../../..//HTTP/Indexes/WorkingWith.html). **Examples** ```js const db = new Database(); -const collection = db.collection('some-collection'); -const index = await collection.createIndex({type: 'hash', fields: ['a', 'a.b']}); +const collection = db.collection("some-collection"); +const index = await collection.createIndex({ + type: "hash", + fields: ["a", "a.b"] +}); // the index has been created with the handle `index.id` ``` @@ -34,34 +37,34 @@ Creates a hash index on the collection. **Arguments** -* **fields**: `Array` +- **fields**: `Array` An array of names of document fields on which to create the index. If the value is a string, it will be wrapped in an array automatically. -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) Additional options for this index. If the value is a boolean, it will be interpreted as _opts.unique_. -For more information on hash indexes, see -[the HTTP API for hash indexes](../../../..//HTTP/Indexes/Hash.html). +For more information on hash indexes, see the +[HTTP API for hash indexes](../../../..//HTTP/Indexes/Hash.html). **Examples** ```js const db = new Database(); -const collection = db.collection('some-collection'); +const collection = db.collection("some-collection"); -const index = await collection.createHashIndex('favorite-color'); +const index = await collection.createHashIndex("favorite-color"); // the index has been created with the handle `index.id` -assert.deepEqual(index.fields, ['favorite-color']); +assert.deepEqual(index.fields, ["favorite-color"]); // -- or -- -const index = await collection.createHashIndex(['favorite-color']); +const index = await collection.createHashIndex(["favorite-color"]); // the index has been created with the handle `index.id` -assert.deepEqual(index.fields, ['favorite-color']); +assert.deepEqual(index.fields, ["favorite-color"]); ``` ## collection.createSkipList @@ -72,34 +75,34 @@ Creates a skiplist index on the collection. **Arguments** -* **fields**: `Array` +- **fields**: `Array` An array of names of document fields on which to create the index. If the value is a string, it will be wrapped in an array automatically. -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) Additional options for this index. If the value is a boolean, it will be interpreted as _opts.unique_. -For more information on skiplist indexes, see -[the HTTP API for skiplist indexes](../../../..//HTTP/Indexes/Skiplist.html). +For more information on skiplist indexes, see the +[HTTP API for skiplist indexes](../../../..//HTTP/Indexes/Skiplist.html). **Examples** ```js const db = new Database(); -const collection = db.collection('some-collection'); +const collection = db.collection("some-collection"); -const index = await collection.createSkipList('favorite-color') +const index = await collection.createSkipList("favorite-color"); // the index has been created with the handle `index.id` -assert.deepEqual(index.fields, ['favorite-color']); +assert.deepEqual(index.fields, ["favorite-color"]); // -- or -- -const index = await collection.createSkipList(['favorite-color']) +const index = await collection.createSkipList(["favorite-color"]); // the index has been created with the handle `index.id` -assert.deepEqual(index.fields, ['favorite-color']); +assert.deepEqual(index.fields, ["favorite-color"]); ``` ## collection.createGeoIndex @@ -110,34 +113,34 @@ Creates a geo-spatial index on the collection. **Arguments** -* **fields**: `Array` +- **fields**: `Array` An array of names of document fields on which to create the index. Currently, geo indexes must cover exactly one field. If the value is a string, it will be wrapped in an array automatically. -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) An object containing additional properties of the index. -For more information on the properties of the _opts_ object see -[the HTTP API for manipulating geo indexes](../../../..//HTTP/Indexes/Geo.html). +For more information on the properties of the _opts_ object see the +[HTTP API for manipulating geo indexes](../../../..//HTTP/Indexes/Geo.html). **Examples** ```js const db = new Database(); -const collection = db.collection('some-collection'); +const collection = db.collection("some-collection"); -const index = await collection.createGeoIndex(['latitude', 'longitude']); +const index = await collection.createGeoIndex(["latitude", "longitude"]); // the index has been created with the handle `index.id` -assert.deepEqual(index.fields, ['longitude', 'latitude']); +assert.deepEqual(index.fields, ["longitude", "latitude"]); // -- or -- -const index = await collection.createGeoIndex('location', {geoJson: true}); +const index = await collection.createGeoIndex("location", { geoJson: true }); // the index has been created with the handle `index.id` -assert.deepEqual(index.fields, ['location']); +assert.deepEqual(index.fields, ["location"]); ``` ## collection.createFulltextIndex @@ -148,13 +151,13 @@ Creates a fulltext index on the collection. **Arguments** -* **fields**: `Array` +- **fields**: `Array` An array of names of document fields on which to create the index. Currently, fulltext indexes must cover exactly one field. If the value is a string, it will be wrapped in an array automatically. -* **minLength** (optional): +- **minLength** (optional): Minimum character length of words to index. Uses a server-specific default value if not specified. @@ -166,17 +169,17 @@ For more information on fulltext indexes, see ```js const db = new Database(); -const collection = db.collection('some-collection'); +const collection = db.collection("some-collection"); -const index = await collection.createFulltextIndex('description'); +const index = await collection.createFulltextIndex("description"); // the index has been created with the handle `index.id` -assert.deepEqual(index.fields, ['description']); +assert.deepEqual(index.fields, ["description"]); // -- or -- -const index = await collection.createFulltextIndex(['description']); +const index = await collection.createFulltextIndex(["description"]); // the index has been created with the handle `index.id` -assert.deepEqual(index.fields, ['description']); +assert.deepEqual(index.fields, ["description"]); ``` ## collection.createPersistentIndex @@ -190,11 +193,11 @@ being that it will always be orders of magnitude slower than in-memory indexes. **Arguments** -* **fields**: `Array` +- **fields**: `Array` An array of names of document fields on which to create the index. -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) An object containing additional properties of the index. @@ -205,11 +208,11 @@ For more information on the properties of the _opts_ object see ```js const db = new Database(); -const collection = db.collection('some-collection'); +const collection = db.collection("some-collection"); -const index = await collection.createPersistentIndex(['name', 'email']); +const index = await collection.createPersistentIndex(["name", "email"]); // the index has been created with the handle `index.id` -assert.deepEqual(index.fields, ['name', 'email']); +assert.deepEqual(index.fields, ["name", "email"]); ``` ## collection.index @@ -220,7 +223,7 @@ Fetches information about the index with the given _indexHandle_ and returns it. **Arguments** -* **indexHandle**: `string` +- **indexHandle**: `string` The handle of the index to look up. This can either be a fully-qualified identifier or the collection-specific key of the index. If the value is an @@ -230,15 +233,15 @@ Fetches information about the index with the given _indexHandle_ and returns it. ```js const db = new Database(); -const collection = db.collection('some-collection'); -const index = await collection.createFulltextIndex('description'); +const collection = db.collection("some-collection"); +const index = await collection.createFulltextIndex("description"); const result = await collection.index(index.id); assert.equal(result.id, index.id); // result contains the properties of the index // -- or -- -const result = await collection.index(index.id.split('/')[1]); +const result = await collection.index(index.id.split("/")[1]); assert.equal(result.id, index.id); // result contains the properties of the index ``` @@ -253,8 +256,8 @@ Fetches a list of all indexes on this collection. ```js const db = new Database(); -const collection = db.collection('some-collection'); -await collection.createFulltextIndex('description') +const collection = db.collection("some-collection"); +await collection.createFulltextIndex("description"); const indexes = await collection.indexes(); assert.equal(indexes.length, 1); // indexes contains information about the index @@ -268,7 +271,7 @@ Deletes the index with the given _indexHandle_ from the collection. **Arguments** -* **indexHandle**: `string` +- **indexHandle**: `string` The handle of the index to delete. This can either be a fully-qualified identifier or the collection-specific key of the index. If the value is an @@ -278,14 +281,14 @@ Deletes the index with the given _indexHandle_ from the collection. ```js const db = new Database(); -const collection = db.collection('some-collection'); -const index = await collection.createFulltextIndex('description'); +const collection = db.collection("some-collection"); +const index = await collection.createFulltextIndex("description"); await collection.dropIndex(index.id); // the index has been removed from the collection // -- or -- -await collection.dropIndex(index.id.split('/')[1]); +await collection.dropIndex(index.id.split("/")[1]); // the index has been removed from the collection ``` @@ -295,41 +298,43 @@ await collection.dropIndex(index.id.split('/')[1]); Creates a cap constraint index on the collection. -**Note**: This method is not available when using the driver with ArangoDB 3.0 -and higher as cap constraints are no longer supported. +{% hint 'warning' %} +This method is not available when targeting ArangoDB 3.0 or later, +see [Compatibility](../../GettingStarted/README.md#compatibility). +{% endhint %} **Arguments** -* **size**: `Object` +- **size**: `Object` An object with any of the following properties: - * **size**: `number` (optional) + - **size**: `number` (optional) The maximum number of documents in the collection. - * **byteSize**: `number` (optional) + - **byteSize**: `number` (optional) The maximum size of active document data in the collection (in bytes). If _size_ is a number, it will be interpreted as _size.size_. -For more information on the properties of the _size_ object see -[the HTTP API for creating cap constraints](https://docs.arangodb.com/2.8/HttpIndexes/Cap.html). +For more information on the properties of the _size_ object see the +[HTTP API for creating cap constraints](https://docs.arangodb.com/2.8/HttpIndexes/Cap.html). **Examples** ```js const db = new Database(); -const collection = db.collection('some-collection'); +const collection = db.collection("some-collection"); -const index = await collection.createCapConstraint(20) +const index = await collection.createCapConstraint(20); // the index has been created with the handle `index.id` assert.equal(index.size, 20); // -- or -- -const index = await collection.createCapConstraint({size: 20}) +const index = await collection.createCapConstraint({ size: 20 }); // the index has been created with the handle `index.id` assert.equal(index.size, 20); ``` diff --git a/Documentation/Books/Drivers/JS/Reference/Collection/README.md b/Documentation/Books/Drivers/JS/Reference/Collection/README.md index cc46c224e6..930279e9b2 100644 --- a/Documentation/Books/Drivers/JS/Reference/Collection/README.md +++ b/Documentation/Books/Drivers/JS/Reference/Collection/README.md @@ -1,4 +1,4 @@ - + # Collection API These functions implement the @@ -13,8 +13,8 @@ their specific type. I.e. it represents a shared subset between instances of ## Getting information about the collection -See -[the HTTP API documentation](../../../..//HTTP/Collection/Getting.html) +See the +[HTTP API documentation](../../../..//HTTP/Collection/Getting.html) for details. ## collection.exists @@ -117,8 +117,8 @@ Retrieves the collection checksum. - **opts**: `Object` (optional) - For information on the possible options see - [the HTTP API for getting collection information](../../../..//HTTP/Collection/Getting.html). + For information on the possible options see the + [HTTP API for getting collection information](../../../..//HTTP/Collection/Getting.html). **Examples** diff --git a/Documentation/Books/Drivers/JS/Reference/Collection/SimpleQueries.md b/Documentation/Books/Drivers/JS/Reference/Collection/SimpleQueries.md index 692e2cfbc5..0ebdee32d1 100644 --- a/Documentation/Books/Drivers/JS/Reference/Collection/SimpleQueries.md +++ b/Documentation/Books/Drivers/JS/Reference/Collection/SimpleQueries.md @@ -1,4 +1,4 @@ - + # Simple queries These functions implement the @@ -13,10 +13,10 @@ Performs a query to fetch all documents in the collection. Returns a **Arguments** -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) - For information on the possible options see - [the HTTP API for returning all documents](../../../..//HTTP/SimpleQuery/index.html#return-all-documents). + For information on the possible options see the + [HTTP API for returning all documents](../../../..//HTTP/SimpleQuery/index.html#return-all-documents). ## collection.any @@ -31,15 +31,17 @@ Fetches a document from the collection at random. Performs a query to fetch the first documents in the collection. Returns an array of the matching documents. -**Note**: This method is not available when using the driver with ArangoDB 3.0 -and higher as the corresponding API method has been removed. +{% hint 'warning' %} +This method is not available when targeting ArangoDB 3.0 or later, +see [Compatibility](../../GettingStarted/README.md#compatibility). +{% endhint %} **Arguments** -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) - For information on the possible options see - [the HTTP API for returning the first document of a collection](https://docs.arangodb.com/2.8/HttpSimpleQuery/#first-document-of-a-collection). + For information on the possible options see the + [HTTP API for returning the first document of a collection](https://docs.arangodb.com/2.8/HttpSimpleQuery/#first-document-of-a-collection). If _opts_ is a number it is treated as _opts.count_. @@ -50,15 +52,17 @@ and higher as the corresponding API method has been removed. Performs a query to fetch the last documents in the collection. Returns an array of the matching documents. -**Note**: This method is not available when using the driver with ArangoDB 3.0 -and higher as the corresponding API method has been removed. +{% hint 'warning' %} +This method is not available when targeting ArangoDB 3.0 or later, +see [Compatibility](../../GettingStarted/README.md#compatibility). +{% endhint %} **Arguments** -* **opts**: `Object` (optional) +- **opts**: `Object` (optional) - For information on the possible options see - [the HTTP API for returning the last document of a collection](https://docs.arangodb.com/2.8/HttpSimpleQuery/#last-document-of-a-collection). + For information on the possible options see the + [HTTP API for returning the last document of a collection](https://docs.arangodb.com/2.8/HttpSimpleQuery/#last-document-of-a-collection). If _opts_ is a number it is treated as _opts.count_. @@ -71,14 +75,14 @@ _example_. Returns a [new _Cursor_ instance](../Cursor.md) for the query results **Arguments** -* **example**: _Object_ +- **example**: _Object_ An object representing an example for documents to be matched against. -* **opts**: _Object_ (optional) +- **opts**: _Object_ (optional) - For information on the possible options see - [the HTTP API for fetching documents by example](../../../..//HTTP/SimpleQuery/index.html#find-documents-matching-an-example). + For information on the possible options see the + [HTTP API for fetching documents by example](../../../..//HTTP/SimpleQuery/index.html#find-documents-matching-an-example). ## collection.firstExample @@ -88,7 +92,7 @@ Fetches the first document in the collection matching the given _example_. **Arguments** -* **example**: _Object_ +- **example**: _Object_ An object representing an example for documents to be matched against. @@ -100,14 +104,14 @@ Removes all documents in the collection matching the given _example_. **Arguments** -* **example**: _Object_ +- **example**: _Object_ An object representing an example for documents to be matched against. -* **opts**: _Object_ (optional) +- **opts**: _Object_ (optional) - For information on the possible options see - [the HTTP API for removing documents by example](../../../..//HTTP/SimpleQuery/index.html#remove-documents-by-example). + For information on the possible options see the + [HTTP API for removing documents by example](../../../..//HTTP/SimpleQuery/index.html#remove-documents-by-example). ## collection.replaceByExample @@ -118,18 +122,18 @@ given _newValue_. **Arguments** -* **example**: _Object_ +- **example**: _Object_ An object representing an example for documents to be matched against. -* **newValue**: _Object_ +- **newValue**: _Object_ The new value to replace matching documents with. -* **opts**: _Object_ (optional) +- **opts**: _Object_ (optional) - For information on the possible options see - [the HTTP API for replacing documents by example](../../../..//HTTP/SimpleQuery/index.html#replace-documents-by-example). + For information on the possible options see the + [HTTP API for replacing documents by example](../../../..//HTTP/SimpleQuery/index.html#replace-documents-by-example). ## collection.updateByExample @@ -140,18 +144,18 @@ with the given _newValue_. **Arguments** -* **example**: _Object_ +- **example**: _Object_ An object representing an example for documents to be matched against. -* **newValue**: _Object_ +- **newValue**: _Object_ The new value to update matching documents with. -* **opts**: _Object_ (optional) +- **opts**: _Object_ (optional) - For information on the possible options see - [the HTTP API for updating documents by example](../../../..//HTTP/SimpleQuery/index.html#update-documents-by-example). + For information on the possible options see the + [HTTP API for updating documents by example](../../../..//HTTP/SimpleQuery/index.html#update-documents-by-example). ## collection.lookupByKeys @@ -162,7 +166,7 @@ array of the matching documents. **Arguments** -* **keys**: _Array_ +- **keys**: _Array_ An array of document keys to look up. @@ -174,14 +178,14 @@ Deletes the documents with the given _keys_ from the collection. **Arguments** -* **keys**: _Array_ +- **keys**: _Array_ An array of document keys to delete. -* **opts**: _Object_ (optional) +- **opts**: _Object_ (optional) - For information on the possible options see - [the HTTP API for removing documents by keys](../../../..//HTTP/SimpleQuery/index.html#remove-documents-by-their-keys). + For information on the possible options see the + [HTTP API for removing documents by keys](../../../..//HTTP/SimpleQuery/index.html#remove-documents-by-their-keys). ## collection.fulltext @@ -191,15 +195,15 @@ Performs a fulltext query in the given _fieldName_ on the collection. **Arguments** -* **fieldName**: _String_ +- **fieldName**: _String_ Name of the field to search on documents in the collection. -* **query**: _String_ +- **query**: _String_ Fulltext query string to search for. -* **opts**: _Object_ (optional) +- **opts**: _Object_ (optional) - For information on the possible options see - [the HTTP API for fulltext queries](../../../..//HTTP/Indexes/Fulltext.html). + For information on the possible options see the + [HTTP API for fulltext queries](../../../..//HTTP/Indexes/Fulltext.html). diff --git a/Documentation/Books/Drivers/JS/Reference/Cursor.md b/Documentation/Books/Drivers/JS/Reference/Cursor.md index c76a3f9ccf..ffed42d31b 100644 --- a/Documentation/Books/Drivers/JS/Reference/Cursor.md +++ b/Documentation/Books/Drivers/JS/Reference/Cursor.md @@ -1,4 +1,4 @@ - + # Cursor API _Cursor_ instances provide an abstraction over the HTTP API's limitations. @@ -178,7 +178,7 @@ Advances the cursor by applying the function _fn_ to each value in the cursor's remaining result list until the cursor is exhausted or _fn_ returns a value that evaluates to `true`. -Returns `true` if _fn_ returned a value that evalutes to `true`, or `false` +Returns `true` if _fn_ returned a value that evaluates to `true`, or `false` otherwise. Equivalent to _Array.prototype.some_ (except async). diff --git a/Documentation/Books/Drivers/JS/Reference/Database/AqlUserFunctions.md b/Documentation/Books/Drivers/JS/Reference/Database/AqlUserFunctions.md index ddc2222731..4391a5b432 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/AqlUserFunctions.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/AqlUserFunctions.md @@ -1,4 +1,4 @@ - + # Managing AQL user functions These functions implement the diff --git a/Documentation/Books/Drivers/JS/Reference/Database/CollectionAccess.md b/Documentation/Books/Drivers/JS/Reference/Database/CollectionAccess.md index 4cd6df4b00..3c2be76df7 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/CollectionAccess.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/CollectionAccess.md @@ -1,4 +1,4 @@ - + # Accessing collections These functions implement the diff --git a/Documentation/Books/Drivers/JS/Reference/Database/DatabaseManipulation.md b/Documentation/Books/Drivers/JS/Reference/Database/DatabaseManipulation.md index 2279f4d318..093263b03e 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/DatabaseManipulation.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/DatabaseManipulation.md @@ -1,132 +1,9 @@ - + # Manipulating databases These functions implement the [HTTP API for manipulating databases](../../../..//HTTP/Database/index.html). -## database.acquireHostList - -`async database.acquireHostList(): this` - -Updates the URL list by requesting a list of all coordinators in the cluster and adding any endpoints not initially specified in the _url_ configuration. - -For long-running processes communicating with an ArangoDB cluster it is recommended to run this method repeatedly (e.g. once per hour) to make sure new coordinators are picked up correctly and can be used for fail-over or load balancing. - -**Note**: This method can not be used when the arangojs instance was created with `isAbsolute: true`. - -## database.useDatabase - -`database.useDatabase(databaseName): this` - -Updates the _Database_ instance and its connection string to use the given -_databaseName_, then returns itself. - -**Note**: This method can not be used when the arangojs instance was created with `isAbsolute: true`. - -**Arguments** - -- **databaseName**: `string` - - The name of the database to use. - -**Examples** - -```js -const db = new Database(); -db.useDatabase("test"); -// The database instance now uses the database "test". -``` - -## database.useBasicAuth - -`database.useBasicAuth([username, [password]]): this` - -Updates the _Database_ instance's `authorization` header to use Basic -authentication with the given _username_ and _password_, then returns itself. - -**Arguments** - -- **username**: `string` (Default: `"root"`) - - The username to authenticate with. - -- **password**: `string` (Default: `""`) - - The password to authenticate with. - -**Examples** - -```js -const db = new Database(); -db.useDatabase("test"); -db.useBasicAuth("admin", "hunter2"); -// The database instance now uses the database "test" -// with the username "admin" and password "hunter2". -``` - -## database.useBearerAuth - -`database.useBearerAuth(token): this` - -Updates the _Database_ instance's `authorization` header to use Bearer -authentication with the given authentication token, then returns itself. - -**Arguments** - -- **token**: `string` - - The token to authenticate with. - -**Examples** - -```js -const db = new Database(); -db.useBearerAuth("keyboardcat"); -// The database instance now uses Bearer authentication. -``` - -## database.login - -`async database.login([username, [password]]): string` - -Validates the given database credentials and exchanges them for an -authentication token, then uses the authentication token for future -requests and returns it. - -**Arguments** - -- **username**: `string` (Default: `"root"`) - - The username to authenticate with. - -- **password**: `string` (Default: `""`) - - The password to authenticate with. - -**Examples** - -```js -const db = new Database(); -db.useDatabase("test"); -await db.login("admin", "hunter2"); -// The database instance now uses the database "test" -// with an authentication token for the "admin" user. -``` - -## database.version - -`async database.version(): Object` - -Fetches the ArangoDB version information for the active database from the server. - -**Examples** - -```js -const db = new Database(); -const version = await db.version(); -// the version object contains the ArangoDB version information. -``` - ## database.createDatabase `async database.createDatabase(databaseName, [users]): Object` @@ -163,7 +40,7 @@ Creates a new database with the given _databaseName_. ```js const db = new Database(); -const info = await db.createDatabase('mydb', [{username: 'root'}]); +const info = await db.createDatabase("mydb", [{ username: "root" }]); // the database has been created ``` @@ -232,7 +109,7 @@ Deletes the database with the given _databaseName_ from the server. ```js const db = new Database(); -await db.dropDatabase('mydb'); +await db.dropDatabase("mydb"); // database "mydb" no longer exists ``` diff --git a/Documentation/Books/Drivers/JS/Reference/Database/FoxxServices.md b/Documentation/Books/Drivers/JS/Reference/Database/FoxxServices.md index d532e5e618..8c5e5f660a 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/FoxxServices.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/FoxxServices.md @@ -1,4 +1,4 @@ - + # Managing Foxx services ## database.listServices @@ -9,7 +9,7 @@ Fetches a list of all installed service. **Arguments** -* **excludeSystem**: `boolean` (Default: `true`) +- **excludeSystem**: `boolean` (Default: `true`) Whether system services should be excluded. @@ -31,56 +31,56 @@ Installs a new service. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **source**: `Buffer | Readable | File | string` +- **source**: `Buffer | Readable | File | string` The service bundle to install. -* **options**: `Object` (optional) +- **options**: `Object` (optional) An object with any of the following properties: - * **configuration**: `Object` (optional) + - **configuration**: `Object` (optional) An object mapping configuration option names to values. - * **dependencies**: `Object` (optional) + - **dependencies**: `Object` (optional) An object mapping dependency aliases to mount points. - * **development**: `boolean` (Default: `false`) + - **development**: `boolean` (Default: `false`) Whether the service should be installed in development mode. - * **legacy**: `boolean` (Default: `false`) + - **legacy**: `boolean` (Default: `false`) Whether the service should be installed in legacy compatibility mode. This overrides the `engines` option in the service manifest (if any). - * **setup**: `boolean` (Default: `true`) + - **setup**: `boolean` (Default: `true`) Whether the setup script should be executed. **Examples** ```js -const source = fs.createReadStream('./my-foxx-service.zip'); -const info = await db.installService('/hello', source); +const source = fs.createReadStream("./my-foxx-service.zip"); +const info = await db.installService("/hello", source); // -- or -- -const source = fs.readFileSync('./my-foxx-service.zip'); -const info = await db.installService('/hello', source); +const source = fs.readFileSync("./my-foxx-service.zip"); +const info = await db.installService("/hello", source); // -- or -- -const element = document.getElementById('my-file-input'); +const element = document.getElementById("my-file-input"); const source = element.files[0]; -const info = await db.installService('/hello', source); +const info = await db.installService("/hello", source); ``` ## database.replaceService @@ -92,64 +92,64 @@ service and installing a new service at the same mount point. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **source**: `Buffer | Readable | File | string` +- **source**: `Buffer | Readable | File | string` The service bundle to replace the existing service with. -* **options**: `Object` (optional) +- **options**: `Object` (optional) An object with any of the following properties: - * **configuration**: `Object` (optional) + - **configuration**: `Object` (optional) An object mapping configuration option names to values. This configuration will replace the existing configuration. - * **dependencies**: `Object` (optional) + - **dependencies**: `Object` (optional) An object mapping dependency aliases to mount points. These dependencies will replace the existing dependencies. - * **development**: `boolean` (Default: `false`) + - **development**: `boolean` (Default: `false`) Whether the new service should be installed in development mode. - * **legacy**: `boolean` (Default: `false`) + - **legacy**: `boolean` (Default: `false`) Whether the new service should be installed in legacy compatibility mode. This overrides the `engines` option in the service manifest (if any). - * **teardown**: `boolean` (Default: `true`) + - **teardown**: `boolean` (Default: `true`) Whether the teardown script of the old service should be executed. - * **setup**: `boolean` (Default: `true`) + - **setup**: `boolean` (Default: `true`) Whether the setup script of the new service should be executed. **Examples** ```js -const source = fs.createReadStream('./my-foxx-service.zip'); -const info = await db.replaceService('/hello', source); +const source = fs.createReadStream("./my-foxx-service.zip"); +const info = await db.replaceService("/hello", source); // -- or -- -const source = fs.readFileSync('./my-foxx-service.zip'); -const info = await db.replaceService('/hello', source); +const source = fs.readFileSync("./my-foxx-service.zip"); +const info = await db.replaceService("/hello", source); // -- or -- -const element = document.getElementById('my-file-input'); +const element = document.getElementById("my-file-input"); const source = element.files[0]; -const info = await db.replaceService('/hello', source); +const info = await db.replaceService("/hello", source); ``` ## database.upgradeService @@ -161,64 +161,64 @@ service's configuration and dependencies. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **source**: `Buffer | Readable | File | string` +- **source**: `Buffer | Readable | File | string` The service bundle to replace the existing service with. -* **options**: `Object` (optional) +- **options**: `Object` (optional) An object with any of the following properties: - * **configuration**: `Object` (optional) + - **configuration**: `Object` (optional) An object mapping configuration option names to values. This configuration will be merged into the existing configuration. - * **dependencies**: `Object` (optional) + - **dependencies**: `Object` (optional) An object mapping dependency aliases to mount points. These dependencies will be merged into the existing dependencies. - * **development**: `boolean` (Default: `false`) + - **development**: `boolean` (Default: `false`) Whether the new service should be installed in development mode. - * **legacy**: `boolean` (Default: `false`) + - **legacy**: `boolean` (Default: `false`) Whether the new service should be installed in legacy compatibility mode. This overrides the `engines` option in the service manifest (if any). - * **teardown**: `boolean` (Default: `false`) + - **teardown**: `boolean` (Default: `false`) Whether the teardown script of the old service should be executed. - * **setup**: `boolean` (Default: `true`) + - **setup**: `boolean` (Default: `true`) Whether the setup script of the new service should be executed. **Examples** ```js -const source = fs.createReadStream('./my-foxx-service.zip'); -const info = await db.upgradeService('/hello', source); +const source = fs.createReadStream("./my-foxx-service.zip"); +const info = await db.upgradeService("/hello", source); // -- or -- -const source = fs.readFileSync('./my-foxx-service.zip'); -const info = await db.upgradeService('/hello', source); +const source = fs.readFileSync("./my-foxx-service.zip"); +const info = await db.upgradeService("/hello", source); // -- or -- -const element = document.getElementById('my-file-input'); +const element = document.getElementById("my-file-input"); const source = element.files[0]; -const info = await db.upgradeService('/hello', source); +const info = await db.upgradeService("/hello", source); ``` ## database.uninstallService @@ -229,22 +229,22 @@ Completely removes a service from the database. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **options**: `Object` (optional) +- **options**: `Object` (optional) An object with any of the following properties: - * **teardown**: `boolean` (Default: `true`) + - **teardown**: `boolean` (Default: `true`) Whether the teardown script should be executed. **Examples** ```js -await db.uninstallService('/my-service'); +await db.uninstallService("/my-service"); // service was uninstalled ``` @@ -256,14 +256,14 @@ Retrieves information about a mounted service. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. **Examples** ```js -const info = await db.getService('/my-service'); +const info = await db.getService("/my-service"); // info contains detailed information about the service ``` @@ -276,39 +276,38 @@ and their current values. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **minimal**: `boolean` (Default: `false`) +- **minimal**: `boolean` (Default: `false`) Only return the current values. **Examples** ```js -const config = await db.getServiceConfiguration('/my-service'); +const config = await db.getServiceConfiguration("/my-service"); // config contains information about the service's configuration ``` ## database.replaceServiceConfiguration -`async database.replaceServiceConfiguration(mount, configuration, [minimal]): -Object` +`async database.replaceServiceConfiguration(mount, configuration, [minimal]): Object` Replaces the configuration of the given service. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **configuration**: `Object` +- **configuration**: `Object` An object mapping configuration option names to values. -* **minimal**: `boolean` (Default: `false`) +- **minimal**: `boolean` (Default: `false`) Only return the current values and warnings (if any). @@ -318,31 +317,30 @@ Replaces the configuration of the given service. **Examples** ```js -const config = {currency: 'USD', locale: 'en-US'}; -const info = await db.replaceServiceConfiguration('/my-service', config); +const config = { currency: "USD", locale: "en-US" }; +const info = await db.replaceServiceConfiguration("/my-service", config); // info.values contains information about the service's configuration // info.warnings contains any validation errors for the configuration ``` ## database.updateServiceConfiguration -`async database.updateServiceConfiguration(mount, configuration, [minimal]): -Object` +`async database.updateServiceConfiguration(mount, configuration, [minimal]): Object` Updates the configuration of the given service my merging the new values into the existing ones. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **configuration**: `Object` +- **configuration**: `Object` An object mapping configuration option names to values. -* **minimal**: `boolean` (Default: `false`) +- **minimal**: `boolean` (Default: `false`) Only return the current values and warnings (if any). @@ -352,8 +350,8 @@ the existing ones. **Examples** ```js -const config = {locale: 'en-US'}; -const info = await db.updateServiceConfiguration('/my-service', config); +const config = { locale: "en-US" }; +const info = await db.updateServiceConfiguration("/my-service", config); // info.values contains information about the service's configuration // info.warnings contains any validation errors for the configuration ``` @@ -367,39 +365,38 @@ current mount points. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **minimal**: `boolean` (Default: `false`) +- **minimal**: `boolean` (Default: `false`) Only return the current values and warnings (if any). **Examples** ```js -const deps = await db.getServiceDependencies('/my-service'); +const deps = await db.getServiceDependencies("/my-service"); // deps contains information about the service's dependencies ``` ## database.replaceServiceDependencies -`async database.replaceServiceDependencies(mount, dependencies, [minimal]): -Object` +`async database.replaceServiceDependencies(mount, dependencies, [minimal]): Object` Replaces the dependencies for the given service. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **dependencies**: `Object` +- **dependencies**: `Object` An object mapping dependency aliases to mount points. -* **minimal**: `boolean` (Default: `false`) +- **minimal**: `boolean` (Default: `false`) Only return the current values and warnings (if any). @@ -409,31 +406,30 @@ Replaces the dependencies for the given service. **Examples** ```js -const deps = {mailer: '/mailer-api', auth: '/remote-auth'}; -const info = await db.replaceServiceDependencies('/my-service', deps); +const deps = { mailer: "/mailer-api", auth: "/remote-auth" }; +const info = await db.replaceServiceDependencies("/my-service", deps); // info.values contains information about the service's dependencies // info.warnings contains any validation errors for the dependencies ``` ## database.updateServiceDependencies -`async database.updateServiceDependencies(mount, dependencies, [minimal]): -Object` +`async database.updateServiceDependencies(mount, dependencies, [minimal]): Object` Updates the dependencies for the given service by merging the new values into the existing ones. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **dependencies**: `Object` +- **dependencies**: `Object` An object mapping dependency aliases to mount points. -* **minimal**: `boolean` (Default: `false`) +- **minimal**: `boolean` (Default: `false`) Only return the current values and warnings (if any). @@ -443,8 +439,8 @@ the existing ones. **Examples** ```js -const deps = {mailer: '/mailer-api'}; -const info = await db.updateServiceDependencies('/my-service', deps); +const deps = { mailer: "/mailer-api" }; +const info = await db.updateServiceDependencies("/my-service", deps); // info.values contains information about the service's dependencies // info.warnings contains any validation errors for the dependencies ``` @@ -457,14 +453,14 @@ Enables development mode for the given service. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. **Examples** ```js -const info = await db.enableServiceDevelopmentMode('/my-service'); +const info = await db.enableServiceDevelopmentMode("/my-service"); // the service is now in development mode // info contains detailed information about the service ``` @@ -478,14 +474,14 @@ the database. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. **Examples** ```js -const info = await db.disableServiceDevelopmentMode('/my-service'); +const info = await db.disableServiceDevelopmentMode("/my-service"); // the service is now in production mode // info contains detailed information about the service ``` @@ -500,14 +496,14 @@ Returns an object mapping each name to a more readable representation. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. **Examples** ```js -const scripts = await db.listServiceScripts('/my-service'); +const scripts = await db.listServiceScripts("/my-service"); // scripts is an object listing the service scripts ``` @@ -519,22 +515,22 @@ Runs a service script and returns the result. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. -* **name**: `string` +- **name**: `string` Name of the script to execute. -* **scriptArg**: `any` +- **scriptArg**: `any` Value that will be passed as an argument to the script. **Examples** ```js -const result = await db.runServiceScript('/my-service', 'setup'); +const result = await db.runServiceScript("/my-service", "setup"); // result contains the script's exports (if any) ``` @@ -546,40 +542,40 @@ Runs the tests of a given service and returns a formatted report. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database -* **options**: `Object` (optional) +- **options**: `Object` (optional) An object with any of the following properties: - * **reporter**: `string` (Default: `default`) + - **reporter**: `string` (Default: `default`) The reporter to use to process the test results. As of ArangoDB 3.2 the following reporters are supported: - * **stream**: an array of event objects - * **suite**: nested suite objects with test results - * **xunit**: JSONML representation of an XUnit report - * **tap**: an array of TAP event strings - * **default**: an array of test results + - **stream**: an array of event objects + - **suite**: nested suite objects with test results + - **xunit**: JSONML representation of an XUnit report + - **tap**: an array of TAP event strings + - **default**: an array of test results - * **idiomatic**: `boolean` (Default: `false`) + - **idiomatic**: `boolean` (Default: `false`) Whether the results should be converted to the apropriate `string` representation: - * **xunit** reports will be formatted as XML documents - * **tap** reports will be formatted as TAP streams - * **stream** reports will be formatted as JSON-LD streams + - **xunit** reports will be formatted as XML documents + - **tap** reports will be formatted as TAP streams + - **stream** reports will be formatted as JSON-LD streams **Examples** ```js -const opts = {reporter: 'xunit', idiomatic: true}; -const result = await db.runServiceTests('/my-service', opts); +const opts = { reporter: "xunit", idiomatic: true }; +const result = await db.runServiceTests("/my-service", opts); // result contains the XUnit report as a string ``` @@ -593,14 +589,14 @@ Returns a `Buffer` in Node or `Blob` in the browser version. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. **Examples** ```js -const bundle = await db.downloadService('/my-service'); +const bundle = await db.downloadService("/my-service"); // bundle is a Buffer/Blob of the service bundle ``` @@ -614,14 +610,14 @@ Returns `undefined` if no such file could be found. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. **Examples** ```js -const readme = await db.getServiceReadme('/my-service'); +const readme = await db.getServiceReadme("/my-service"); // readme is a string containing the service README's // text content, or undefined if no README exists ``` @@ -635,14 +631,14 @@ given mount point. **Arguments** -* **mount**: `string` +- **mount**: `string` The service's mount point, relative to the database. **Examples** ```js -const spec = await db.getServiceDocumentation('/my-service'); +const spec = await db.getServiceDocumentation("/my-service"); // spec is a Swagger API description of the service ``` @@ -655,7 +651,7 @@ bundles missing in the database. **Arguments** -* **replace**: `boolean` (Default: `false`) +- **replace**: `boolean` (Default: `false`) Also commit outdated services. diff --git a/Documentation/Books/Drivers/JS/Reference/Database/GraphAccess.md b/Documentation/Books/Drivers/JS/Reference/Database/GraphAccess.md index a2dff34e63..b1f18fdce9 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/GraphAccess.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/GraphAccess.md @@ -1,4 +1,4 @@ - + # Accessing graphs These functions implement the diff --git a/Documentation/Books/Drivers/JS/Reference/Database/HttpRoutes.md b/Documentation/Books/Drivers/JS/Reference/Database/HttpRoutes.md index d9219f549e..69e0c687ab 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/HttpRoutes.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/HttpRoutes.md @@ -1,4 +1,4 @@ - + # Arbitrary HTTP routes ## database.route diff --git a/Documentation/Books/Drivers/JS/Reference/Database/Queries.md b/Documentation/Books/Drivers/JS/Reference/Database/Queries.md index 8688fbeea6..8c37736f8d 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/Queries.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/Queries.md @@ -1,10 +1,10 @@ - + # Queries This function implements the -[HTTP API for single roundtrip AQL queries](../../../..//HTTP/AqlQueryCursor/QueryResults.html). +[HTTP API for single round-trip AQL queries](../../../..//HTTP/AqlQueryCursor/QueryResults.html). -For collection-specific queries see [simple queries](../Collection/SimpleQueries.md). +For collection-specific queries see [Simple Queries](../Collection/SimpleQueries.md). ## database.query @@ -31,8 +31,11 @@ Performs a database query using the given _query_ and _bindVars_, then returns a If _opts.count_ is set to `true`, the cursor will have a _count_ property set to the query result count. -Possible key options in _opts.options_ include: _failOnWarning_, _cache_, profile or _skipInaccessibleCollections_. -For a complete list of query settings please reference the [arangodb.com documentation](../../../..//AQL/Invocation/WithArangosh.html#setting-options). + +Possible key options in _opts.options_ include: _failOnWarning_, _cache_, +profile or _skipInaccessibleCollections_. +For a complete list of query settings please reference the +[setting options](../../../..//AQL/Invocation/WithArangosh.html#setting-options). If _query_ is an object with _query_ and _bindVars_ properties, those will be used as the values of the respective arguments instead. diff --git a/Documentation/Books/Drivers/JS/Reference/Database/README.md b/Documentation/Books/Drivers/JS/Reference/Database/README.md index 6c48faad81..ffedc7b229 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/README.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/README.md @@ -1,4 +1,4 @@ - + # Database API ## new Database @@ -20,12 +20,15 @@ If _config_ is a string, it will be interpreted as _config.url_. Base URL of the ArangoDB server or list of server URLs. When working with a cluster or a single server with leader/follower failover, - [the method `db.acquireHostList`](DatabaseManipulation.md#databaseacquirehostlist) + [the method `db.acquireHostList`](#databaseacquirehostlist) can be used to automatically pick up additional coordinators/followers at any point. - **Note**: As of arangojs 6.0.0 it is no longer possible to pass - the username or password from the URL. + {% hint 'warning' %} + As of arangojs 6.0.0 it is no longer possible to pass + the username or password from the URL. Use + [`database.useBasicAuth`](#databaseusebasicauth) instead. + {% endhint %} If you want to use ArangoDB with authentication, see _useBasicAuth_ or _useBearerAuth_ methods. @@ -51,17 +54,13 @@ If _config_ is a string, it will be interpreted as _config.url_. - **arangoVersion**: `number` (Default: `30000`) - Value of the `x-arango-version` header. This should match the lowest - version of ArangoDB you expect to be using. The format is defined as - `XYYZZ` where `X` is the major version, `Y` is the two-digit minor version - and `Z` is the two-digit bugfix version. + Numeric representation of the ArangoDB version the driver should expect. + The format is defined as `XYYZZ` where `X` is the major version, `Y` is + the zero-filled two-digit minor version and `Z` is the zero-filled two-digit + bugfix version, e.g. `30102` for 3.1.2, `20811` for 2.8.11. - **Example**: `30102` corresponds to version 3.1.2 of ArangoDB. - - **Note**: The driver will behave differently when using different major - versions of ArangoDB to compensate for API changes. Some functions are - not available on every major version of ArangoDB as indicated in their - descriptions below (e.g. _collection.first_, _collection.bulkUpdate_). + Depending on this value certain methods may become unavailable or change + their behavior to remain compatible with different versions of ArangoDB. - **headers**: `Object` (optional) @@ -134,6 +133,135 @@ If _config_ is a string, it will be interpreted as _config.url_. **Note**: Requests bound to a specific server (e.g. fetching query results) will never be retried automatically and ignore this setting. +## database.acquireHostList + +`async database.acquireHostList(): this` + +Updates the URL list by requesting a list of all coordinators in the cluster +and adding any endpoints not initially specified in the _url_ configuration. + +For long-running processes communicating with an ArangoDB cluster it is +recommended to run this method repeatedly (e.g. once per hour) to make sure +new coordinators are picked up correctly and can be used for fail-over or +load balancing. + +**Note**: This method can not be used when the arangojs instance was created +with `isAbsolute: true`. + +## database.useDatabase + +`database.useDatabase(databaseName): this` + +Updates the _Database_ instance and its connection string to use the given +_databaseName_, then returns itself. + +**Note**: This method can not be used when the arangojs instance was created +with `isAbsolute: true`. + +**Arguments** + +- **databaseName**: `string` + + The name of the database to use. + +**Examples** + +```js +const db = new Database(); +db.useDatabase("test"); +// The database instance now uses the database "test". +``` + +## database.useBasicAuth + +`database.useBasicAuth([username, [password]]): this` + +Updates the _Database_ instance's `authorization` header to use Basic +authentication with the given _username_ and _password_, then returns itself. + +**Arguments** + +- **username**: `string` (Default: `"root"`) + + The username to authenticate with. + +- **password**: `string` (Default: `""`) + + The password to authenticate with. + +**Examples** + +```js +const db = new Database(); +db.useDatabase("test"); +db.useBasicAuth("admin", "hunter2"); +// The database instance now uses the database "test" +// with the username "admin" and password "hunter2". +``` + +## database.useBearerAuth + +`database.useBearerAuth(token): this` + +Updates the _Database_ instance's `authorization` header to use Bearer +authentication with the given authentication token, then returns itself. + +**Arguments** + +- **token**: `string` + + The token to authenticate with. + +**Examples** + +```js +const db = new Database(); +db.useBearerAuth("keyboardcat"); +// The database instance now uses Bearer authentication. +``` + +## database.login + +`async database.login([username, [password]]): string` + +Validates the given database credentials and exchanges them for an +authentication token, then uses the authentication token for future +requests and returns it. + +**Arguments** + +- **username**: `string` (Default: `"root"`) + + The username to authenticate with. + +- **password**: `string` (Default: `""`) + + The password to authenticate with. + +**Examples** + +```js +const db = new Database(); +db.useDatabase("test"); +await db.login("admin", "hunter2"); +// The database instance now uses the database "test" +// with an authentication token for the "admin" user. +``` + +## database.version + +`async database.version(): Object` + +Fetches the ArangoDB version information for the active database from the server. + +**Examples** + +```js +const db = new Database(); +const version = await db.version(); +// the version object contains the ArangoDB version information. +``` + ## database.close `database.close(): void` diff --git a/Documentation/Books/Drivers/JS/Reference/Database/Transactions.md b/Documentation/Books/Drivers/JS/Reference/Database/Transactions.md index 6b209f5312..e3955725ac 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/Transactions.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/Transactions.md @@ -1,4 +1,4 @@ - + # Transactions This function implements the @@ -6,62 +6,65 @@ This function implements the ## database.transaction -`async database.transaction(collections, action, [params, [options]]): -Object` +`async database.transaction(collections, action, [params, [options]]): Object` Performs a server-side transaction and returns its return value. **Arguments** -* **collections**: `Object` +- **collections**: `Object` An object with the following properties: - * **read**: `Array` (optional) + - **read**: `Array` (optional) An array of names (or a single name) of collections that will be read from during the transaction. - * **write**: `Array` (optional) + - **write**: `Array` (optional) An array of names (or a single name) of collections that will be written to or read from during the transaction. -* **action**: `string` +- **action**: `string` A string evaluating to a JavaScript function to be executed on the server. - **Note**: For accessing the database from within ArangoDB, see - [the documentation for the `@arangodb` module in ArangoDB](../../../..//Manual/Appendix/JavaScriptModules/ArangoDB.html). + {% hint 'warning ' %} + This function will be executed on the server inside ArangoDB and can not use + the arangojs driver or any variables other than those passed as _params_. + For accessing the database from within ArangoDB, see the documentation for the + [`@arangodb` module in ArangoDB](../../../..//Manual/Appendix/JavaScriptModules/ArangoDB.html). + {% endhint %} -* **params**: `Object` (optional) +- **params**: `Object` (optional) Available as variable `params` when the _action_ function is being executed on server. Check the example below. -* **options**: `Object` (optional) +- **options**: `Object` (optional) An object with any of the following properties: - * **lockTimeout**: `number` (optional) + - **lockTimeout**: `number` (optional) Determines how long the database will wait while attempting to gain locks on collections used by the transaction before timing out. - * **waitForSync**: `boolean` (optional) + - **waitForSync**: `boolean` (optional) Determines whether to force the transaction to write all data to disk before returning. - * **maxTransactionSize**: `number` (optional) + - **maxTransactionSize**: `number` (optional) Determines the transaction size limit in bytes. Honored by the RocksDB storage engine only. - * **intermediateCommitCount**: `number` (optional) + - **intermediateCommitCount**: `number` (optional) Determines the maximum number of operations after which an intermediate commit is performed automatically. Honored by the RocksDB storage engine only. - * **intermediateCommitSize**: `number` (optional) + - **intermediateCommitSize**: `number` (optional) Determine the maximum total size of operations after which an intermediate commit is performed automatically. Honored by the RocksDB storage engine only. @@ -74,27 +77,27 @@ JavaScript function, it's not possible to pass in a JavaScript function directly because the function needs to be evaluated on the server and will be transmitted in plain text. -For more information on transactions, see -[the HTTP API documentation for transactions](../../../..//HTTP/Transaction/index.html). +For more information on transactions, see the +[HTTP API documentation for transactions](../../../..//HTTP/Transaction/index.html). **Examples** ```js const db = new Database(); -const action = String(function (params) { +const action = String(function(params) { // This code will be executed inside ArangoDB! - const db = require('@arangodb').db; - return db._query(aql` + const db = require("@arangodb").db; + return db + ._query( + aql` FOR user IN _users FILTER user.age > ${params.age} RETURN u.user - `).toArray(); + ` + ) + .toArray(); }); -const result = await db.transaction( - {read: '_users'}, - action, - {age: 12} -); +const result = await db.transaction({ read: "_users" }, action, { age: 12 }); // result contains the return value of the action ``` diff --git a/Documentation/Books/Drivers/JS/Reference/Database/ViewAccess.md b/Documentation/Books/Drivers/JS/Reference/Database/ViewAccess.md index 094770012b..9cb1f51675 100644 --- a/Documentation/Books/Drivers/JS/Reference/Database/ViewAccess.md +++ b/Documentation/Books/Drivers/JS/Reference/Database/ViewAccess.md @@ -1,4 +1,4 @@ - + # Accessing views These functions implement the @@ -8,13 +8,18 @@ These functions implement the `database.arangoSearchView(viewName): ArangoSearchView` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../../GettingStarted/README.md#compatibility). +{% endhint %} + Returns a _ArangoSearchView_ instance for the given view name. **Arguments** - **viewName**: `string` - Name of the `arangosearch` view. + Name of the arangosearch view. **Examples** @@ -27,6 +32,11 @@ const view = db.arangoSearchView("potatoes"); `async database.listViews(): Array` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../../GettingStarted/README.md#compatibility). +{% endhint %} + Fetches all views from the database and returns an array of view descriptions. @@ -43,6 +53,11 @@ const views = await db.listViews(); `async database.views([excludeSystem]): Array` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../../GettingStarted/README.md#compatibility). +{% endhint %} + Fetches all views from the database and returns an array of _ArangoSearchView_ instances for the views. @@ -51,6 +66,6 @@ _ArangoSearchView_ instances for the views. ```js const db = new Database(); -const views = await db.views() +const views = await db.views(); // views is an array of ArangoSearchView instances ``` diff --git a/Documentation/Books/Drivers/JS/Reference/Graph/EdgeCollection.md b/Documentation/Books/Drivers/JS/Reference/Graph/EdgeCollection.md index 54013684ca..7dcfad62ef 100644 --- a/Documentation/Books/Drivers/JS/Reference/Graph/EdgeCollection.md +++ b/Documentation/Books/Drivers/JS/Reference/Graph/EdgeCollection.md @@ -1,4 +1,4 @@ - + # GraphEdgeCollection API The _GraphEdgeCollection API_ extends the diff --git a/Documentation/Books/Drivers/JS/Reference/Graph/Edges.md b/Documentation/Books/Drivers/JS/Reference/Graph/Edges.md index 6b5a818b71..e9d24739c0 100644 --- a/Documentation/Books/Drivers/JS/Reference/Graph/Edges.md +++ b/Documentation/Books/Drivers/JS/Reference/Graph/Edges.md @@ -1,4 +1,4 @@ - + # Manipulating edges ## graph.edgeCollection diff --git a/Documentation/Books/Drivers/JS/Reference/Graph/README.md b/Documentation/Books/Drivers/JS/Reference/Graph/README.md index 23d92d35ec..c288a67445 100644 --- a/Documentation/Books/Drivers/JS/Reference/Graph/README.md +++ b/Documentation/Books/Drivers/JS/Reference/Graph/README.md @@ -1,4 +1,4 @@ - + # Graph API These functions implement the diff --git a/Documentation/Books/Drivers/JS/Reference/Graph/VertexCollection.md b/Documentation/Books/Drivers/JS/Reference/Graph/VertexCollection.md index 573270367c..c18dada54c 100644 --- a/Documentation/Books/Drivers/JS/Reference/Graph/VertexCollection.md +++ b/Documentation/Books/Drivers/JS/Reference/Graph/VertexCollection.md @@ -1,4 +1,4 @@ - + # GraphVertexCollection API The _GraphVertexCollection API_ extends the diff --git a/Documentation/Books/Drivers/JS/Reference/Graph/Vertices.md b/Documentation/Books/Drivers/JS/Reference/Graph/Vertices.md index 6ab1e45495..2c8fa51ae4 100644 --- a/Documentation/Books/Drivers/JS/Reference/Graph/Vertices.md +++ b/Documentation/Books/Drivers/JS/Reference/Graph/Vertices.md @@ -1,4 +1,4 @@ - + # Manipulating vertices ## graph.vertexCollection diff --git a/Documentation/Books/Drivers/JS/Reference/README.md b/Documentation/Books/Drivers/JS/Reference/README.md index 891e41ef49..705994aff9 100644 --- a/Documentation/Books/Drivers/JS/Reference/README.md +++ b/Documentation/Books/Drivers/JS/Reference/README.md @@ -1,4 +1,4 @@ - + # ArangoDB JavaScript Driver - Reference - [Database](Database/README.md) diff --git a/Documentation/Books/Drivers/JS/Reference/Route.md b/Documentation/Books/Drivers/JS/Reference/Route.md index 5c87f8ae51..1426398b14 100644 --- a/Documentation/Books/Drivers/JS/Reference/Route.md +++ b/Documentation/Books/Drivers/JS/Reference/Route.md @@ -1,4 +1,4 @@ - + # Route API _Route_ instances provide access for arbitrary HTTP requests. This allows easy diff --git a/Documentation/Books/Drivers/JS/Reference/ViewManipulation.md b/Documentation/Books/Drivers/JS/Reference/ViewManipulation.md index 0f91360463..bf8e95b605 100644 --- a/Documentation/Books/Drivers/JS/Reference/ViewManipulation.md +++ b/Documentation/Books/Drivers/JS/Reference/ViewManipulation.md @@ -1,4 +1,4 @@ - + # View API These functions implement the @@ -8,13 +8,18 @@ These functions implement the `async view.exists(): boolean` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../GettingStarted/README.md#compatibility). +{% endhint %} + Checks whether the view exists. **Examples** ```js const db = new Database(); -const view = db.arangoSearchView('some-view'); +const view = db.arangoSearchView("some-view"); const result = await view.exists(); // result indicates whether the view exists ``` @@ -23,13 +28,18 @@ const result = await view.exists(); `async view.get(): Object` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../GettingStarted/README.md#compatibility). +{% endhint %} + Retrieves general information about the view. **Examples** ```js const db = new Database(); -const view = db.arangoSearchView('some-view'); +const view = db.arangoSearchView("some-view"); const data = await view.get(); // data contains general information about the view ``` @@ -38,13 +48,18 @@ const data = await view.get(); `async view.properties(): Object` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../GettingStarted/README.md#compatibility). +{% endhint %} + Retrieves the view's properties. **Examples** ```js const db = new Database(); -const view = db.arangoSearchView('some-view'); +const view = db.arangoSearchView("some-view"); const data = await view.properties(); // data contains the view's properties ``` @@ -53,6 +68,11 @@ const data = await view.properties(); `async view.create([properties]): Object` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../GettingStarted/README.md#compatibility). +{% endhint %} + Creates a view with the given _properties_ for this view's name, then returns the server response. @@ -60,15 +80,15 @@ then returns the server response. - **properties**: `Object` (optional) - For more information on the _properties_ object, see - [the HTTP API documentation for creating views](../../..//HTTP/Views/ArangoSearch.html). + For more information on the _properties_ object, see the + [HTTP API documentation for creating views](../../..//HTTP/Views/ArangoSearch.html). **Examples** ```js const db = new Database(); -const view = db.arangoSearchView('potatoes'); -await view.create() +const view = db.arangoSearchView("potatoes"); +await view.create(); // the arangosearch view "potatoes" now exists ``` @@ -76,50 +96,65 @@ await view.create() `async view.setProperties(properties): Object` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../GettingStarted/README.md#compatibility). +{% endhint %} + Updates the properties of the view. **Arguments** - **properties**: `Object` - For information on the _properties_ argument see - [the HTTP API for modifying views](../../..//HTTP/Views/ArangoSearch.html). + For information on the _properties_ argument see the + [HTTP API for modifying views](../../..//HTTP/Views/ArangoSearch.html). **Examples** ```js const db = new Database(); -const view = db.arangoSearchView('some-view'); -const result = await view.setProperties({ locale: "C" }) -assert.equal(result.locale, "C"); +const view = db.arangoSearchView("some-view"); +const result = await view.setProperties({ consolidationIntervalMsec: 123 }); +assert.equal(result.consolidationIntervalMsec, 123); ``` ## view.replaceProperties `async view.replaceProperties(properties): Object` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../GettingStarted/README.md#compatibility). +{% endhint %} + Replaces the properties of the view. **Arguments** - **properties**: `Object` - For information on the _properties_ argument see - [the HTTP API for modifying views](../../..//HTTP/Views/ArangoSearch.html). + For information on the _properties_ argument see the + [HTTP API for modifying views](../../..//HTTP/Views/ArangoSearch.html). **Examples** ```js const db = new Database(); -const view = db.arangoSearchView('some-view'); -const result = await view.replaceProperties({ locale: "C" }) -assert.equal(result.locale, "C"); +const view = db.arangoSearchView("some-view"); +const result = await view.replaceProperties({ consolidationIntervalMsec: 234 }); +assert.equal(result.consolidationIntervalMsec, 234); ``` ## view.rename `async view.rename(name): Object` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../GettingStarted/README.md#compatibility). +{% endhint %} + Renames the view. The _View_ instance will automatically update its name when the rename succeeds. @@ -127,9 +162,9 @@ name when the rename succeeds. ```js const db = new Database(); -const view = db.arangoSearchView('some-view'); -const result = await view.rename('new-view-name') -assert.equal(result.name, 'new-view-name'); +const view = db.arangoSearchView("some-view"); +const result = await view.rename("new-view-name"); +assert.equal(result.name, "new-view-name"); assert.equal(view.name, result.name); // result contains additional information about the view ``` @@ -138,13 +173,18 @@ assert.equal(view.name, result.name); `async view.drop(): Object` +{% hint 'info' %} +This method is only available when targeting ArangoDB 3.4 or later, +see [Compatibility](../GettingStarted/README.md#compatibility). +{% endhint %} + Deletes the view from the database. **Examples** ```js const db = new Database(); -const view = db.arangoSearchView('some-view'); +const view = db.arangoSearchView("some-view"); await view.drop(); // the view "some-view" no longer exists ``` diff --git a/Documentation/Books/Drivers/Java/GettingStarted/README.md b/Documentation/Books/Drivers/Java/GettingStarted/README.md index 48b8924c41..da8660a82a 100644 --- a/Documentation/Books/Drivers/Java/GettingStarted/README.md +++ b/Documentation/Books/Drivers/Java/GettingStarted/README.md @@ -1,10 +1,11 @@ - + # ArangoDB Java Driver - Getting Started ## Supported versions + @@ -26,7 +27,7 @@ ArangoDB 3.x.x com.arangodb arangodb-java-driver - 4.6.0 + 5.0.0 ``` diff --git a/Documentation/Books/Drivers/Java/README.md b/Documentation/Books/Drivers/Java/README.md index 71ef332fd9..ee7da9e33a 100644 --- a/Documentation/Books/Drivers/Java/README.md +++ b/Documentation/Books/Drivers/Java/README.md @@ -1,4 +1,4 @@ - + # ArangoDB Java Driver The official ArangoDB Java Driver. diff --git a/Documentation/Books/Drivers/Java/Reference/Collection/BulkImport.md b/Documentation/Books/Drivers/Java/Reference/Collection/BulkImport.md index f6a0616e3b..9a3becb039 100644 --- a/Documentation/Books/Drivers/Java/Reference/Collection/BulkImport.md +++ b/Documentation/Books/Drivers/Java/Reference/Collection/BulkImport.md @@ -1,4 +1,4 @@ - + # Bulk importing documents This function implements the diff --git a/Documentation/Books/Drivers/Java/Reference/Collection/CollectionManipulation.md b/Documentation/Books/Drivers/Java/Reference/Collection/CollectionManipulation.md index 8870d7ea09..4247d4645c 100644 --- a/Documentation/Books/Drivers/Java/Reference/Collection/CollectionManipulation.md +++ b/Documentation/Books/Drivers/Java/Reference/Collection/CollectionManipulation.md @@ -1,4 +1,4 @@ - + # Manipulating the collection These functions implement @@ -73,8 +73,8 @@ Creates a collection with the given _options_ for this collection's name, then r ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -db.createCollection("potatoes", new CollectionCreateOptions()); -// the document collection "potatoes" now exists +db.createCollection("potatos", new CollectionCreateOptions()); +// the document collection "potatos" now exists ``` ## ArangoCollection.create @@ -144,9 +144,9 @@ Alternative for [ArangoDatabase.createCollection](#arangodatabasecreatecollectio ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoCollection collection = db.collection("potatoes"); +ArangoCollection collection = db.collection("potatos"); collection.create(new CollectionCreateOptions()); -// the document collection "potatoes" now exists +// the document collection "potatos" now exists ``` ## ArangoCollection.load diff --git a/Documentation/Books/Drivers/Java/Reference/Collection/DocumentManipulation.md b/Documentation/Books/Drivers/Java/Reference/Collection/DocumentManipulation.md index ce95cba342..757cb1d1b5 100644 --- a/Documentation/Books/Drivers/Java/Reference/Collection/DocumentManipulation.md +++ b/Documentation/Books/Drivers/Java/Reference/Collection/DocumentManipulation.md @@ -1,4 +1,4 @@ - + # Manipulating documents These functions implement the diff --git a/Documentation/Books/Drivers/Java/Reference/Collection/Indexes.md b/Documentation/Books/Drivers/Java/Reference/Collection/Indexes.md index a8d133aeb1..00fec902c0 100644 --- a/Documentation/Books/Drivers/Java/Reference/Collection/Indexes.md +++ b/Documentation/Books/Drivers/Java/Reference/Collection/Indexes.md @@ -1,4 +1,4 @@ - + # Manipulating indexes These functions implement the diff --git a/Documentation/Books/Drivers/Java/Reference/Collection/README.md b/Documentation/Books/Drivers/Java/Reference/Collection/README.md index 8400e8a744..9cbbe9a9fd 100644 --- a/Documentation/Books/Drivers/Java/Reference/Collection/README.md +++ b/Documentation/Books/Drivers/Java/Reference/Collection/README.md @@ -1,4 +1,4 @@ - + # Collection API These functions implement the @@ -26,7 +26,7 @@ Checks whether the collection exists ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoCollection collection = db.collection("potatoes"); +ArangoCollection collection = db.collection("potatos"); boolean exists = collection.exists(); ``` @@ -44,7 +44,7 @@ Returns information about the collection. ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoCollection collection = db.collection("potatoes"); +ArangoCollection collection = db.collection("potatos"); CollectionEntity info = collection.getInfo(); ``` @@ -62,7 +62,7 @@ Reads the properties of the specified collection. ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoCollection collection = db.collection("potatoes"); +ArangoCollection collection = db.collection("potatos"); CollectionPropertiesEntity properties = collection.getProperties(); ``` @@ -80,7 +80,7 @@ Retrieve the collections revision. ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoCollection collection = db.collection("potatoes"); +ArangoCollection collection = db.collection("potatos"); CollectionRevisionEntity revision = collection.getRevision(); ``` @@ -98,7 +98,7 @@ Fetches a list of all indexes on this collection. ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoCollection collection = db.collection("potatoes"); +ArangoCollection collection = db.collection("potatos"); Collection indexes = collection.getIndexes(); ``` diff --git a/Documentation/Books/Drivers/Java/Reference/Cursor.md b/Documentation/Books/Drivers/Java/Reference/Cursor.md index ad733a6b8d..edb85bc6b8 100644 --- a/Documentation/Books/Drivers/Java/Reference/Cursor.md +++ b/Documentation/Books/Drivers/Java/Reference/Cursor.md @@ -1,4 +1,4 @@ - + # Cursor API _ArangoCursor_ instances provide an abstraction over the HTTP API's limitations. Unless a method explicitly exhausts the cursor, the driver will only fetch as many batches from the server as necessary. Like the server-side cursors, _ArangoCursor_ instances are incrementally depleted as they are read from. diff --git a/Documentation/Books/Drivers/Java/Reference/Database/AqlUserFunctions.md b/Documentation/Books/Drivers/Java/Reference/Database/AqlUserFunctions.md index 5e1b2cf2a8..274940ed45 100644 --- a/Documentation/Books/Drivers/Java/Reference/Database/AqlUserFunctions.md +++ b/Documentation/Books/Drivers/Java/Reference/Database/AqlUserFunctions.md @@ -1,4 +1,4 @@ - + # Managing AQL user functions These functions implement the diff --git a/Documentation/Books/Drivers/Java/Reference/Database/CollectionAccess.md b/Documentation/Books/Drivers/Java/Reference/Database/CollectionAccess.md index 7457496cf0..e48f75f160 100644 --- a/Documentation/Books/Drivers/Java/Reference/Database/CollectionAccess.md +++ b/Documentation/Books/Drivers/Java/Reference/Database/CollectionAccess.md @@ -1,4 +1,4 @@ - + # Accessing collections These functions implement the diff --git a/Documentation/Books/Drivers/Java/Reference/Database/DatabaseManipulation.md b/Documentation/Books/Drivers/Java/Reference/Database/DatabaseManipulation.md index 14267dd977..8451c6123b 100644 --- a/Documentation/Books/Drivers/Java/Reference/Database/DatabaseManipulation.md +++ b/Documentation/Books/Drivers/Java/Reference/Database/DatabaseManipulation.md @@ -1,4 +1,4 @@ - + # Manipulation databases These functions implement the diff --git a/Documentation/Books/Drivers/Java/Reference/Database/GraphAccess.md b/Documentation/Books/Drivers/Java/Reference/Database/GraphAccess.md index cfce964694..a227360dfd 100644 --- a/Documentation/Books/Drivers/Java/Reference/Database/GraphAccess.md +++ b/Documentation/Books/Drivers/Java/Reference/Database/GraphAccess.md @@ -1,4 +1,4 @@ - + # Accessing graphs These functions implement the diff --git a/Documentation/Books/Drivers/Java/Reference/Database/HttpRoutes.md b/Documentation/Books/Drivers/Java/Reference/Database/HttpRoutes.md index 5d601671a4..aca43ab56c 100644 --- a/Documentation/Books/Drivers/Java/Reference/Database/HttpRoutes.md +++ b/Documentation/Books/Drivers/Java/Reference/Database/HttpRoutes.md @@ -1,4 +1,4 @@ - + # Arbitrary HTTP routes ## ArangoDatabase.route diff --git a/Documentation/Books/Drivers/Java/Reference/Database/Queries.md b/Documentation/Books/Drivers/Java/Reference/Database/Queries.md index 56854ab2b2..900ba09224 100644 --- a/Documentation/Books/Drivers/Java/Reference/Database/Queries.md +++ b/Documentation/Books/Drivers/Java/Reference/Database/Queries.md @@ -1,4 +1,4 @@ - + # Queries This function implements the @@ -78,7 +78,7 @@ Performs a database query using the given _query_ and _bindVars_, then returns a - **fullCount**: `Boolean` - If set to true and the query contains a LIMIT clause, then the result will have an extra attribute with the sub-attributes stats and fullCount, { ... , "extra": { "stats": { "fullCount": 123 } } }. The fullCount attribute will contain the number of documents in the result before the last top-level LIMIT in the query was applied. It can be used to count the number of documents that match certain filter criteria, but only return a subset of them, in one go. It is thus similar to MySQL's SQL_CALC_FOUND_ROWS hint. Note that setting the option will disable a few LIMIT optimizations and may lead to more documents being processed, and thus make queries run longer. Note that the fullCount attribute may only be present in the result if the query has a top-level LIMIT clause and the LIMIT clause is actually used in the query. + If set to true and the query contains a LIMIT clause, then the result will have an extra attribute with the sub-attributes stats and fullCount, { ... , "extra": { "stats": { "fullCount": 123 } } }. The fullCount attribute will contain the number of documents in the result before the last LIMIT in the query was applied. It can be used to count the number of documents that match certain filter criteria, but only return a subset of them, in one go. It is thus similar to MySQL's SQL_CALC_FOUND_ROWS hint. Note that setting the option will disable a few LIMIT optimizations and may lead to more documents being processed, and thus make queries run longer. Note that the fullCount attribute will only be present in the result if the query has a LIMIT clause and the LIMIT clause is actually used in the query. - **maxPlans**: `Integer` diff --git a/Documentation/Books/Drivers/Java/Reference/Database/README.md b/Documentation/Books/Drivers/Java/Reference/Database/README.md index 702e8e0e2d..110a01eef8 100644 --- a/Documentation/Books/Drivers/Java/Reference/Database/README.md +++ b/Documentation/Books/Drivers/Java/Reference/Database/README.md @@ -1,4 +1,4 @@ - + # Database API ## ArangoDB.db diff --git a/Documentation/Books/Drivers/Java/Reference/Database/Transactions.md b/Documentation/Books/Drivers/Java/Reference/Database/Transactions.md index 0d8b70b080..6f543b38ac 100644 --- a/Documentation/Books/Drivers/Java/Reference/Database/Transactions.md +++ b/Documentation/Books/Drivers/Java/Reference/Database/Transactions.md @@ -1,4 +1,4 @@ - + # Transactions This function implements the diff --git a/Documentation/Books/Drivers/Java/Reference/Database/ViewAccess.md b/Documentation/Books/Drivers/Java/Reference/Database/ViewAccess.md index 3d146e0f37..ecf24fe30e 100644 --- a/Documentation/Books/Drivers/Java/Reference/Database/ViewAccess.md +++ b/Documentation/Books/Drivers/Java/Reference/Database/ViewAccess.md @@ -1,4 +1,4 @@ - + # Accessing views These functions implement the @@ -32,7 +32,7 @@ ArangoView view = db.view("myView"); ArangoDatabase.arangoSearch(String name) : ArangoSearch ``` -Returns a _ArangoSearch_ instance for the given ArangoSearch View name. +Returns a _ArangoSearch_ instance for the given ArangoSearch view name. **Arguments** diff --git a/Documentation/Books/Drivers/Java/Reference/Graph/EdgeCollection.md b/Documentation/Books/Drivers/Java/Reference/Graph/EdgeCollection.md index 978b85e607..c9c8c8d6d3 100644 --- a/Documentation/Books/Drivers/Java/Reference/Graph/EdgeCollection.md +++ b/Documentation/Books/Drivers/Java/Reference/Graph/EdgeCollection.md @@ -1,4 +1,4 @@ - + # Manipulating the edge collection ## ArangoGraph.edgeCollection diff --git a/Documentation/Books/Drivers/Java/Reference/Graph/Edges.md b/Documentation/Books/Drivers/Java/Reference/Graph/Edges.md index e7c2064fcc..400a654b6b 100644 --- a/Documentation/Books/Drivers/Java/Reference/Graph/Edges.md +++ b/Documentation/Books/Drivers/Java/Reference/Graph/Edges.md @@ -1,4 +1,4 @@ - + # Manipulating edges ## ArangoEdgeCollection.getEdge diff --git a/Documentation/Books/Drivers/Java/Reference/Graph/README.md b/Documentation/Books/Drivers/Java/Reference/Graph/README.md index 68a1021091..b72a19460c 100644 --- a/Documentation/Books/Drivers/Java/Reference/Graph/README.md +++ b/Documentation/Books/Drivers/Java/Reference/Graph/README.md @@ -1,4 +1,4 @@ - + # Graph API These functions implement the diff --git a/Documentation/Books/Drivers/Java/Reference/Graph/VertexCollection.md b/Documentation/Books/Drivers/Java/Reference/Graph/VertexCollection.md index dc1b8fff3c..e1969e30cd 100644 --- a/Documentation/Books/Drivers/Java/Reference/Graph/VertexCollection.md +++ b/Documentation/Books/Drivers/Java/Reference/Graph/VertexCollection.md @@ -1,4 +1,4 @@ - + # Manipulating the vertex collection ## ArangoGraph.vertexCollection diff --git a/Documentation/Books/Drivers/Java/Reference/Graph/Vertices.md b/Documentation/Books/Drivers/Java/Reference/Graph/Vertices.md index c25540a763..6668695e57 100644 --- a/Documentation/Books/Drivers/Java/Reference/Graph/Vertices.md +++ b/Documentation/Books/Drivers/Java/Reference/Graph/Vertices.md @@ -1,4 +1,4 @@ - + # Manipulating vertices ## ArangoVertexCollection.getVertex diff --git a/Documentation/Books/Drivers/Java/Reference/README.md b/Documentation/Books/Drivers/Java/Reference/README.md index d42492d9f1..c986f37b1b 100644 --- a/Documentation/Books/Drivers/Java/Reference/README.md +++ b/Documentation/Books/Drivers/Java/Reference/README.md @@ -1,4 +1,4 @@ - + # ArangoDB Java Driver - Reference - [Driver Setup](Setup.md) diff --git a/Documentation/Books/Drivers/Java/Reference/Route.md b/Documentation/Books/Drivers/Java/Reference/Route.md index 48955f9d2a..926c7929bf 100644 --- a/Documentation/Books/Drivers/Java/Reference/Route.md +++ b/Documentation/Books/Drivers/Java/Reference/Route.md @@ -1,4 +1,4 @@ - + # Route API _ArangoRoute_ instances provide access for arbitrary HTTP requests. This allows easy access to Foxx services and other HTTP APIs not covered by the driver itself. diff --git a/Documentation/Books/Drivers/Java/Reference/Serialization.md b/Documentation/Books/Drivers/Java/Reference/Serialization.md index de432db0fa..7a0b70336f 100644 --- a/Documentation/Books/Drivers/Java/Reference/Serialization.md +++ b/Documentation/Books/Drivers/Java/Reference/Serialization.md @@ -1,4 +1,4 @@ - + # Serialization ## VelocyPack serialization diff --git a/Documentation/Books/Drivers/Java/Reference/Setup.md b/Documentation/Books/Drivers/Java/Reference/Setup.md index ae132c4fe7..4380d25bf8 100644 --- a/Documentation/Books/Drivers/Java/Reference/Setup.md +++ b/Documentation/Books/Drivers/Java/Reference/Setup.md @@ -1,4 +1,4 @@ - + # Driver setup Setup with default configuration, this automatically loads a properties file arangodb.properties if exists in the classpath: @@ -74,7 +74,7 @@ To use SSL, you have to set the configuration `useSsl` to `true` and set a `SSLC ## Connection Pooling -The driver supports connection pooling for VelocyStream with a default of 1 and HTTP with a default of 20 maximum connections. To change this value use the method `maxConnections(Integer)` in `ArangoDB.Builder`. +The driver supports connection pooling for VelocyStream with a default of 1 and HTTP with a default of 20 maximum connections per host. To change this value use the method `maxConnections(Integer)` in `ArangoDB.Builder`. ```Java ArangoDB arangoDB = new ArangoDB.Builder().maxConnections(8).build(); @@ -104,16 +104,16 @@ Since version 4.3 the driver support acquiring a list of known hosts in a cluste Since version 4.3 the driver supports load balancing for cluster setups in two different ways. -The first one is a round robin load balancing where the driver iterates through a list of known hosts and performs every request on a different host than the request before. This load balancing strategy only work when the maximun of connections is greater 1. +The first one is a round robin load balancing where the driver iterates through a list of known hosts and performs every request on a different host than the request before. ```Java - ArangoDB arangoDB = new ArangoDB.Builder().loadBalancingStrategy(LoadBalancingStrategy.ROUND_ROBIN).maxConnections(8).build(); + ArangoDB arangoDB = new ArangoDB.Builder().loadBalancingStrategy(LoadBalancingStrategy.ROUND_ROBIN).build(); ``` Just like the Fallback hosts feature the round robin load balancing strategy can use the `acquireHostList` configuration to acquire a list of all known hosts in the cluster. Do so only requires the manually configuration of only one host. Because this list is updated frequently it makes load balancing over the whole cluster very comfortable. ```Java - ArangoDB arangoDB = new ArangoDB.Builder().loadBalancingStrategy(LoadBalancingStrategy.ROUND_ROBIN).maxConnections(8).acquireHostList(true).build(); + ArangoDB arangoDB = new ArangoDB.Builder().loadBalancingStrategy(LoadBalancingStrategy.ROUND_ROBIN).acquireHostList(true).build(); ``` The second load balancing strategy allows to pick a random host from the configured or acquired list of hosts and sticks to that host as long as the connection is open. This strategy is useful for an application - using the driver - which provides a session management where each session has its own instance of `ArangoDB` build from a global configured list of hosts. In this case it could be wanted that every sessions sticks with all its requests to the same host but not all sessions should use the same host. This load balancing strategy also works together with `acquireHostList`. @@ -124,7 +124,7 @@ The second load balancing strategy allows to pick a random host from the configu ## Connection time to live -Since version 4.4 the driver supports setting a TTL for connections managed by the internal connection pool. Setting a TTL helps when using load balancing strategy `ROUND_ROBIN`, because as soon as a coordinator goes down, every open connection to that host will be closed and opened again with another target coordinator. As long as the driver does not have to open new connections (all connections in the pool are used) it will use only the coordinators which never went down. To use the downed coordinator again, when it is running again, the connections in the connection pool have to be closed and opened again with the target host mentioned by the load balancing strategy. To achieve this you can manually call `ArangoDB.shutdown` in your client code or use the TTL for connection so that a downed coordinator (which is then brought up again) will be used again after a certain time. +Since version 4.4 the driver supports setting a TTL for connections managed by the internal connection pool. ```Java ArangoDB arango = new ArangoDB.Builder().connectionTtl(5 * 60 * 1000).build(); diff --git a/Documentation/Books/Drivers/Java/Reference/View/ArangoSearch.md b/Documentation/Books/Drivers/Java/Reference/View/ArangoSearch.md index 7f52b92f71..f443897e3c 100644 --- a/Documentation/Books/Drivers/Java/Reference/View/ArangoSearch.md +++ b/Documentation/Books/Drivers/Java/Reference/View/ArangoSearch.md @@ -1,8 +1,8 @@ - + # ArangoSearch API These functions implement the -[HTTP API for ArangoSearch Views](../../../..//HTTP/Views/ArangoSearch.html). +[HTTP API for ArangoSearch views](../../../..//HTTP/Views/ArangoSearch.html). ## ArangoDatabase.createArangoSearch @@ -10,7 +10,7 @@ These functions implement the ArangoDatabase.createArangoSearch(String name, ArangoSearchCreateOptions options) : ViewEntity ``` -Creates a ArangoSearch View with the given _options_, then returns view information from the server. +Creates a ArangoSearch view with the given _options_, then returns view information from the server. **Arguments** @@ -20,11 +20,7 @@ Creates a ArangoSearch View with the given _options_, then returns view informat - **options**: `ArangoSearchCreateOptions` - - **locale**: `String` - - The default locale used for queries on analyzed string values (default: C). - - - **commitIntervalMsec**: `Long` + - **consolidationIntervalMsec**: `Long` Wait at least this many milliseconds between committing index data changes and making them visible to queries (default: 60000, to disable use: 0). For the case where there are a lot of inserts/updates, a lower value, until commit, will cause the index not to account for them and memory usage would continue to grow. For the case where there are a few inserts/updates, a higher value will impact performance and waste disk space for each commit call without any added benefits. @@ -32,17 +28,31 @@ Creates a ArangoSearch View with the given _options_, then returns view informat Wait at least this many commits between removing unused files in data directory (default: 10, to disable use: 0). For the case where the consolidation policies merge segments often (i.e. a lot of commit+consolidate), a lower value will cause a lot of disk space to be wasted. For the case where the consolidation policies rarely merge segments (i.e. few inserts/deletes), a higher value will impact performance without any added benefits. - - **threshold**: `ConsolidateThreshold[]` + - **consolidationPolicy**: - A list of consolidate thresholds + - **type**: `ConsolidationType` + + The type of the consolidation policy. + + - **threshold**: `Double` + + Select a given segment for "consolidation" if and only if the formula based on type (as defined above) evaluates to true, valid value range [0.0, 1.0] (default: 0.85) + + - **segmentThreshold**: `Long` + + Apply the "consolidation" operation if and only if (default: 300): {segmentThreshold} < number_of_segments + + - **link**: `CollectionLink[]` + + A list of linked collections **Examples** ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -db.createArangoSearch("potatoes", new ArangoSearchPropertiesOptions()); -// the ArangoSearch View "potatoes" now exists +db.createArangoSearch("potatos", new ArangoSearchPropertiesOptions()); +// the ArangoSearch view "potatos" now exists ``` ## ArangoSearch.create @@ -51,19 +61,15 @@ db.createArangoSearch("potatoes", new ArangoSearchPropertiesOptions()); ArangoSearch.create(ArangoSearchCreateOptions options) : ViewEntity ``` -Creates a ArangoSearch View with the given _options_, then returns view information from the server. +Creates a ArangoSearch view with the given _options_, then returns view information from the server. -Alternative for [ArangoDatabase.createArangoSearch](#arangodatabasecreatearangosearch). +Alternative for `ArangoDatabase.createArangoSearch`. **Arguments** - **options**: `ArangoSearchCreateOptions` - - **locale**: `String` - - The default locale used for queries on analyzed string values (default: C). - - - **commitIntervalMsec**: `Long` + - **consolidationIntervalMsec**: `Long` Wait at least this many milliseconds between committing index data changes and making them visible to queries (default: 60000, to disable use: 0). For the case where there are a lot of inserts/updates, a lower value, until commit, will cause the index not to account for them and memory usage would continue to grow. For the case where there are a few inserts/updates, a higher value will impact performance and waste disk space for each commit call without any added benefits. @@ -71,19 +77,33 @@ Alternative for [ArangoDatabase.createArangoSearch](#arangodatabasecreatearangos Wait at least this many commits between removing unused files in data directory (default: 10, to disable use: 0). For the case where the consolidation policies merge segments often (i.e. a lot of commit+consolidate), a lower value will cause a lot of disk space to be wasted. For the case where the consolidation policies rarely merge segments (i.e. few inserts/deletes), a higher value will impact performance without any added benefits. - - **threshold**: `ConsolidateThreshold[]` + - **consolidationPolicy**: - A list of consolidate thresholds + - **type**: `ConsolidationType` + + The type of the consolidation policy. + + - **threshold**: `Double` + + Select a given segment for "consolidation" if and only if the formula based on type (as defined above) evaluates to true, valid value range [0.0, 1.0] (default: 0.85) + + - **segmentThreshold**: `Long` + + Apply the "consolidation" operation if and only if (default: 300): {segmentThreshold} < number_of_segments + + - **link**: `CollectionLink[]` + + A list of linked collections **Examples** ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoSearch view = db.arangoSearch("potatoes"); +ArangoSearch view = db.arangoSearch("potatos"); view.create(new ArangoSearchPropertiesOptions()); -// the ArangoSearch View "potatoes" now exists +// the ArangoSearch view "potatos" now exists ``` ## ArangoSearch.getProperties @@ -99,7 +119,7 @@ Reads the properties of the specified view. ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoSearch view = db.arangoSearch("potatoes"); +ArangoSearch view = db.arangoSearch("potatos"); ArangoSearchPropertiesEntity properties = view.getProperties(); ``` @@ -116,11 +136,7 @@ Partially changes properties of the view. - **options**: `ArangoSearchPropertiesOptions` - - **locale**: `String` - - The default locale used for queries on analyzed string values (default: C). - - - **commitIntervalMsec**: `Long` + - **consolidationIntervalMsec**: `Long` Wait at least this many milliseconds between committing index data changes and making them visible to queries (default: 60000, to disable use: 0). For the case where there are a lot of inserts/updates, a lower value, until commit, will cause the index not to account for them and memory usage would continue to grow. For the case where there are a few inserts/updates, a higher value will impact performance and waste disk space for each commit call without any added benefits. @@ -128,13 +144,23 @@ Partially changes properties of the view. Wait at least this many commits between removing unused files in data directory (default: 10, to disable use: 0). For the case where the consolidation policies merge segments often (i.e. a lot of commit+consolidate), a lower value will cause a lot of disk space to be wasted. For the case where the consolidation policies rarely merge segments (i.e. few inserts/deletes), a higher value will impact performance without any added benefits. - - **threshold**: `ConsolidateThreshold[]` + - **consolidationPolicy**: - A list of consolidate thresholds + - **type**: `ConsolidationType` - - **link**: `CollectionLink[]` + The type of the consolidation policy. - A list of linked collections + - **threshold**: `Double` + + Select a given segment for "consolidation" if and only if the formula based on type (as defined above) evaluates to true, valid value range [0.0, 1.0] (default: 0.85) + + - **segmentThreshold**: `Long` + + Apply the "consolidation" operation if and only if (default: 300): {segmentThreshold} < number_of_segments + + - **link**: `CollectionLink[]` + + A list of linked collections **Examples** @@ -158,11 +184,7 @@ Changes properties of the view. - **options**: `ArangoSearchPropertiesOptions` - - **locale**: `String` - - The default locale used for queries on analyzed string values (default: C). - - - **commitIntervalMsec**: `Long` + - **consolidationIntervalMsec**: `Long` Wait at least this many milliseconds between committing index data changes and making them visible to queries (default: 60000, to disable use: 0). For the case where there are a lot of inserts/updates, a lower value, until commit, will cause the index not to account for them and memory usage would continue to grow. For the case where there are a few inserts/updates, a higher value will impact performance and waste disk space for each commit call without any added benefits. @@ -170,13 +192,23 @@ Changes properties of the view. Wait at least this many commits between removing unused files in data directory (default: 10, to disable use: 0). For the case where the consolidation policies merge segments often (i.e. a lot of commit+consolidate), a lower value will cause a lot of disk space to be wasted. For the case where the consolidation policies rarely merge segments (i.e. few inserts/deletes), a higher value will impact performance without any added benefits. - - **threshold**: `ConsolidateThreshold[]` + - **consolidationPolicy**: - A list of consolidate thresholds + - **type**: `ConsolidationType` - - **link**: `CollectionLink[]` + The type of the consolidation policy. - A list of linked collections + - **threshold**: `Double` + + Select a given segment for "consolidation" if and only if the formula based on type (as defined above) evaluates to true, valid value range [0.0, 1.0] (default: 0.85) + + - **segmentThreshold**: `Long` + + Apply the "consolidation" operation if and only if (default: 300): {segmentThreshold} < number_of_segments + + - **link**: `CollectionLink[]` + + A list of linked collections **Examples** diff --git a/Documentation/Books/Drivers/Java/Reference/View/README.md b/Documentation/Books/Drivers/Java/Reference/View/README.md index 4ff8316d08..e91210855f 100644 --- a/Documentation/Books/Drivers/Java/Reference/View/README.md +++ b/Documentation/Books/Drivers/Java/Reference/View/README.md @@ -1,4 +1,4 @@ - + # View API These functions implement the @@ -23,7 +23,7 @@ Checks whether the view exists ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoView view = db.view("potatoes"); +ArangoView view = db.view("potatos"); boolean exists = view.exists(); ``` @@ -41,7 +41,7 @@ Returns information about the view. ```Java ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); -ArangoView view = db.view("potatoes"); +ArangoView view = db.view("potatos"); ViewEntity info = view.getInfo(); ``` diff --git a/Documentation/Books/Drivers/Java/Reference/View/ViewManipulation.md b/Documentation/Books/Drivers/Java/Reference/View/ViewManipulation.md index 627ed7a1b7..3a3f93610a 100644 --- a/Documentation/Books/Drivers/Java/Reference/View/ViewManipulation.md +++ b/Documentation/Books/Drivers/Java/Reference/View/ViewManipulation.md @@ -1,4 +1,4 @@ - + # Manipulating the view These functions implement @@ -28,7 +28,7 @@ Creates a view of the given _type_, then returns view information from the serve ArangoDB arango = new ArangoDB.Builder().build(); ArangoDatabase db = arango.db("myDB"); db.createView("myView", ViewType.ARANGO_SEARCH); -// the view "potatoes" now exists +// the view "potatos" now exists ``` ## ArangoView.rename diff --git a/Documentation/Books/Drivers/PHP/GettingStarted/README.md b/Documentation/Books/Drivers/PHP/GettingStarted/README.md index 18a8357540..5c00b2a7ad 100644 --- a/Documentation/Books/Drivers/PHP/GettingStarted/README.md +++ b/Documentation/Books/Drivers/PHP/GettingStarted/README.md @@ -1,4 +1,4 @@ - + # ArangoDB-PHP - Getting Started ## Description diff --git a/Documentation/Books/Drivers/PHP/README.md b/Documentation/Books/Drivers/PHP/README.md index a99a89b612..967e1a58e7 100644 --- a/Documentation/Books/Drivers/PHP/README.md +++ b/Documentation/Books/Drivers/PHP/README.md @@ -1,4 +1,4 @@ - + # ArangoDB-PHP - A PHP client for ArangoDB The official ArangoDB PHP Driver. diff --git a/Documentation/Books/Drivers/PHP/Tutorial/README.md b/Documentation/Books/Drivers/PHP/Tutorial/README.md index 0a47d7dcf6..c69bfb5a18 100644 --- a/Documentation/Books/Drivers/PHP/Tutorial/README.md +++ b/Documentation/Books/Drivers/PHP/Tutorial/README.md @@ -1,4 +1,4 @@ - + # ArangoDB-PHP - Tutorial ## Setting up the connection options diff --git a/Documentation/Books/Drivers/SUMMARY.md b/Documentation/Books/Drivers/SUMMARY.md index 08926750c1..7b0c28fcca 100644 --- a/Documentation/Books/Drivers/SUMMARY.md +++ b/Documentation/Books/Drivers/SUMMARY.md @@ -5,7 +5,7 @@ ## Official Drivers -# https://@github.com/arangodb/arangodb-java-driver.git;arangodb-java-driver;docs/Drivers;;/ + * [Java Driver](Java/README.md) * [Getting Started](Java/GettingStarted/README.md) * [Reference](Java/Reference/README.md) @@ -35,7 +35,7 @@ * [Edges Manipulation](Java/Reference/Graph/Edges.md) * [Route](Java/Reference/Route.md) * [Serialization](Java/Reference/Serialization.md) -# https://@github.com/arangodb/arangodbjs.git;arangodbjs;docs/Drivers;;/ + * [ArangoJS - JavaScript Driver](JS/README.md) * [Getting Started](JS/GettingStarted/README.md) * [Reference](JS/Reference/README.md) @@ -65,11 +65,11 @@ * [VertexCollection](JS/Reference/Graph/VertexCollection.md) * [EdgeCollection](JS/Reference/Graph/EdgeCollection.md) * [Route](JS/Reference/Route.md) -# https://@github.com/arangodb/arangodb-php.git;arangodb-php;docs/Drivers;;/ + * [ArangoDB-PHP](PHP/README.md) * [Getting Started](PHP/GettingStarted/README.md) * [Tutorial](PHP/Tutorial/README.md) -# https://@github.com/arangodb/go-driver.git;go-driver;docs/Drivers;;/ + * [ArangoDB Go Driver](GO/README.md) * [Getting Started](GO/GettingStarted/README.md) * [Example Requests](GO/ExampleRequests/README.md) @@ -77,7 +77,7 @@ ## Integrations -# https://@github.com/arangodb/spring-data.git;spring-data;docs/Drivers;;/ + * [Spring Data ArangoDB](SpringData/README.md) * [Getting Started](SpringData/GettingStarted/README.md) * [Reference](SpringData/Reference/README.md) @@ -102,13 +102,14 @@ * [Indexes](SpringData/Reference/Mapping/Indexes.md) * [Converter](SpringData/Reference/Mapping/Converter.md) * [Events](SpringData/Reference/Mapping/Events.md) + * [Auditing](SpringData/Reference/Mapping/Auditing.md) * [Migration](SpringData/Migration/README.md) * [Migrating 1.x to 3.0](SpringData/Migration/Migrating-1.x-3.0.md) * [Migrating 2.x to 3.0](SpringData/Migration/Migrating-2.x-3.0.md) - -# https://@github.com/arangodb/arangodb-spark-connector.git;arangodb-spark-connector;docs/Drivers;;/ + * [ArangoDB Spark Connector](SparkConnector/README.md) * [Getting Started](SparkConnector/GettingStarted/README.md) * [Reference](SparkConnector/Reference/README.md) * [Java](SparkConnector/Reference/Java.md) * [Scala](SparkConnector/Reference/Scala.md) + diff --git a/Documentation/Books/Drivers/SparkConnector/GettingStarted/README.md b/Documentation/Books/Drivers/SparkConnector/GettingStarted/README.md index 4ae00ec792..36e819583f 100644 --- a/Documentation/Books/Drivers/SparkConnector/GettingStarted/README.md +++ b/Documentation/Books/Drivers/SparkConnector/GettingStarted/README.md @@ -1,4 +1,4 @@ - + # ArangoDB Spark Connector - Getting Started ## Maven @@ -27,6 +27,7 @@ libraryDependencies += "com.arangodb" % "arangodb-spark-connector" % "1.0.2" | arangodb.hosts | comma separated list of ArangoDB hosts | 127.0.0.1:8529 | | arangodb.user | basic authentication user | root | | arangodb.password | basic authentication password | | +| arangodb.protocol | network protocol | VST | | arangodb.useSsl | use SSL connection | false | | arangodb.ssl.keyStoreFile | SSL certificate keystore file | | | arangodb.ssl.passPhrase | SSL pass phrase | | diff --git a/Documentation/Books/Drivers/SparkConnector/README.md b/Documentation/Books/Drivers/SparkConnector/README.md index f71a4aba05..74af7cdb4f 100644 --- a/Documentation/Books/Drivers/SparkConnector/README.md +++ b/Documentation/Books/Drivers/SparkConnector/README.md @@ -1,4 +1,4 @@ - + # ArangoDB Spark Connector - [Getting Started](GettingStarted/README.md) diff --git a/Documentation/Books/Drivers/SparkConnector/Reference/Java.md b/Documentation/Books/Drivers/SparkConnector/Reference/Java.md index 2eeabe94ba..5d95b60485 100644 --- a/Documentation/Books/Drivers/SparkConnector/Reference/Java.md +++ b/Documentation/Books/Drivers/SparkConnector/Reference/Java.md @@ -1,4 +1,4 @@ - + # ArangoDB Spark Connector - Java Reference ## ArangoSpark.save diff --git a/Documentation/Books/Drivers/SparkConnector/Reference/README.md b/Documentation/Books/Drivers/SparkConnector/Reference/README.md index d4255d9fa3..83c7c03256 100644 --- a/Documentation/Books/Drivers/SparkConnector/Reference/README.md +++ b/Documentation/Books/Drivers/SparkConnector/Reference/README.md @@ -1,4 +1,4 @@ - + # ArangoDB Spark Connector - Reference - [Scala](Scala.md) diff --git a/Documentation/Books/Drivers/SparkConnector/Reference/Scala.md b/Documentation/Books/Drivers/SparkConnector/Reference/Scala.md index af5e23cb5f..6f7816a833 100644 --- a/Documentation/Books/Drivers/SparkConnector/Reference/Scala.md +++ b/Documentation/Books/Drivers/SparkConnector/Reference/Scala.md @@ -1,4 +1,4 @@ - + # ArangoDB Spark Connector - Scala Reference ## ArangoSpark.save diff --git a/Documentation/Books/Drivers/SpringData/GettingStarted/README.md b/Documentation/Books/Drivers/SpringData/GettingStarted/README.md index 3c3c733155..7bbc79dd05 100644 --- a/Documentation/Books/Drivers/SpringData/GettingStarted/README.md +++ b/Documentation/Books/Drivers/SpringData/GettingStarted/README.md @@ -1,4 +1,4 @@ - + # Spring Data ArangoDB - Getting Started ## Supported versions @@ -24,7 +24,7 @@ To use Spring Data ArangoDB in your project, your build automation tool needs to com.arangodb arangodb-spring-data - 2.3.1 + 3.1.0 ``` diff --git a/Documentation/Books/Drivers/SpringData/Migration/Migrating-1.x-3.0.md b/Documentation/Books/Drivers/SpringData/Migration/Migrating-1.x-3.0.md index 59e38316f9..e571f44bc9 100644 --- a/Documentation/Books/Drivers/SpringData/Migration/Migrating-1.x-3.0.md +++ b/Documentation/Books/Drivers/SpringData/Migration/Migrating-1.x-3.0.md @@ -1,4 +1,4 @@ - -# Migrating Spring Data ArangoDB 2.x to 3.0 + +# Migrating Spring Data ArangoDB 1.x to 3.0 see [Migrating 2.x to 3.0](Migrating-2.x-3.0.md) diff --git a/Documentation/Books/Drivers/SpringData/Migration/Migrating-2.x-3.0.md b/Documentation/Books/Drivers/SpringData/Migration/Migrating-2.x-3.0.md index f10c3ebe83..2b99f88a45 100644 --- a/Documentation/Books/Drivers/SpringData/Migration/Migrating-2.x-3.0.md +++ b/Documentation/Books/Drivers/SpringData/Migration/Migrating-2.x-3.0.md @@ -1,4 +1,4 @@ - + # Migrating Spring Data ArangoDB 2.x to 3.0 ## Annotations @Key diff --git a/Documentation/Books/Drivers/SpringData/Migration/README.md b/Documentation/Books/Drivers/SpringData/Migration/README.md index 7aac7260b8..5e036a2726 100644 --- a/Documentation/Books/Drivers/SpringData/Migration/README.md +++ b/Documentation/Books/Drivers/SpringData/Migration/README.md @@ -1,4 +1,4 @@ - + # Spring Data ArangoDB - Migration - [Migrating 1.x to 3.0](Migrating-1.x-3.0.md) diff --git a/Documentation/Books/Drivers/SpringData/README.md b/Documentation/Books/Drivers/SpringData/README.md index c782f3310b..8c02250919 100644 --- a/Documentation/Books/Drivers/SpringData/README.md +++ b/Documentation/Books/Drivers/SpringData/README.md @@ -1,4 +1,4 @@ - + # Spring Data ArangoDB - [Getting Started](GettingStarted/README.md) diff --git a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Auditing.md b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Auditing.md new file mode 100644 index 0000000000..efafff0409 --- /dev/null +++ b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Auditing.md @@ -0,0 +1,78 @@ + +# Auditing + +Since version 3.0.0 Spring Data ArangoDB provides basic auditing functionallity where you can track who made changes on your data and when. + +To enable auditing you have to add the annotation `@EnableArangoAuditing` to your configuration class. + +```Java +@Configuration +@EnableArangoAuditing +public class MyConfiguration extends AbstractArangoConfiguration { +``` + +We can now add fields to our model classes and annotade them with `@CreateDate`, `@CreatedBy`, `@LastModifiedDate` and `@LastModifiedBy` to store the auditing information. All annotation names should be self-explanatory. + +```Java +@Document +public class MyEntity { + + @CreatedDate + private Instant created; + + @CreatedBy + private User createdBy; + + @LastModifiedDate + private Instant modified; + + @LastModifiedBy + private User modifiedBy; + +} +``` + +The annotations `@CreateDate` and `@LastModifiedDate` are working with fields of any kind of Date/Timestamp type which is supported by Spring Data. (i.e. `java.util.Date`, `java.time.Instant`, `java.time.LocalDateTime`). + +For `@CreatedBy` and `@LastModifiedBy` we need to provide Spring Data the information of the current auditor (i.e. `User` in our case). We can do so by implementing the `AuditorAware` interface + +```Java +public class AuditorProvider implements AuditorAware { + @Override + public Optional getCurrentAuditor() { + // return current user + } +} +``` + +and add the implementation as a bean to our Spring context. + +```Java +@Configuration +@EnableArangoAuditing(auditorAwareRef = "auditorProvider") +public class MyConfiguration extends AbstractArangoConfiguration { + + @Bean + public AuditorAware auditorProvider() { + return new AuditorProvider(); + } + +} +``` + +If you use a type in your `AuditorAware` implementation, which will be also persisted in your database and you only want to save a reference in your entity, just add the [@Ref annotation](Reference.md) to the fields annotated with `@CreatedBy` and `@LastModifiedBy`. Keep in mind that you have to save the `User` in your database first to get a valid reference. + +```Java +@Document +public class MyEntity { + + @Ref + @CreatedBy + private User createdBy; + + @Ref + @LastModifiedBy + private User modifiedBy; + +} +``` diff --git a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Converter.md b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Converter.md index d366db8eda..5e951dd2e1 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Converter.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Converter.md @@ -1,4 +1,4 @@ - + # Converter ## Registering a Spring Converter diff --git a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Document.md b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Document.md index e34d59063b..020f60ae35 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Document.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Document.md @@ -1,4 +1,4 @@ - + # Document ## Annotation @Document diff --git a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Edge.md b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Edge.md index e7ead89857..f5b8453c9f 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Edge.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Edge.md @@ -1,4 +1,4 @@ - + # Edge ## Annotation @Edge diff --git a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Events.md b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Events.md index 023ef26b4e..eb78546849 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Events.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Events.md @@ -1,4 +1,4 @@ - + # Events Spring Data ArangoDB includes several `ApplicationEvent` events that your application can respond to by registering subclasses of `AbstractArangoEventListener` in the ApplicationContext. diff --git a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Indexes.md b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Indexes.md index 6273d0b58b..5f17058d96 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Indexes.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Indexes.md @@ -1,4 +1,4 @@ - + # Indexes ## Annotation @\Indexed diff --git a/Documentation/Books/Drivers/SpringData/Reference/Mapping/README.md b/Documentation/Books/Drivers/SpringData/Reference/Mapping/README.md index 2d203c8098..6e4dae3020 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Mapping/README.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Mapping/README.md @@ -1,4 +1,4 @@ - + # Mapping In this section we will describe the features and conventions for mapping Java objects to documents and how to override those conventions with annotation based mapping metadata. diff --git a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Reference.md b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Reference.md index 08bb5432ad..37e1e1b844 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Reference.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Reference.md @@ -1,4 +1,4 @@ - + # Reference With the annotation `@Ref` applied on a field the nested object isn’t stored as a nested object in the document. The `_id` field of the nested object is stored in the document and the nested object has to be stored as a separate document in another collection described in the `@Document` annotation of the nested object class. To successfully persist an instance of your object the referencing field has to be null or it's instance has to provide a field with the annotation `@Id` including a valid id. diff --git a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Relations.md b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Relations.md index c4eca63cdd..f9eae9b7a2 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Mapping/Relations.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Mapping/Relations.md @@ -1,4 +1,4 @@ - + # Relations With the annotation `@Relations` applied on a collection or array field in a class annotated with `@Document` the nested objects are fetched from the database over a graph traversal with your current object as the starting point. The most relevant parameter is `edge`. With `edge` you define the edge collection - which should be used in the traversal - using the class type. With the parameter `depth` you can define the maximal depth for the traversal (default 1) and the parameter `direction` defines whether the traversal should follow outgoing or incoming edges (default Direction.ANY). diff --git a/Documentation/Books/Drivers/SpringData/Reference/README.md b/Documentation/Books/Drivers/SpringData/Reference/README.md index 95b997c26a..03306fb5bf 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/README.md +++ b/Documentation/Books/Drivers/SpringData/Reference/README.md @@ -1,4 +1,4 @@ - + # Spring Data ArangoDB - Reference - [Template](Template/README.md) @@ -22,3 +22,4 @@ - [Indexes](Mapping/Indexes.md) - [Converter](Mapping/Converter.md) - [Events](Mapping/Events.md) + - [Auditing](Mapping/Auditing.md) diff --git a/Documentation/Books/Drivers/SpringData/Reference/Repositories/DocumentManipulation.md b/Documentation/Books/Drivers/SpringData/Reference/Repositories/DocumentManipulation.md index f6932a03aa..b3f97cc004 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Repositories/DocumentManipulation.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Repositories/DocumentManipulation.md @@ -1,4 +1,4 @@ - + # Manipulating documents ## ArangoRepository.existsById diff --git a/Documentation/Books/Drivers/SpringData/Reference/Repositories/MultiDocumentManipulation.md b/Documentation/Books/Drivers/SpringData/Reference/Repositories/MultiDocumentManipulation.md index d2090913d0..36f1717b2e 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Repositories/MultiDocumentManipulation.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Repositories/MultiDocumentManipulation.md @@ -1,4 +1,4 @@ - + # Manipulating multiple documents ## ArangoRepository.findAll diff --git a/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/DerivedQueries.md b/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/DerivedQueries.md index df1bdb5744..fa16da5b85 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/DerivedQueries.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/DerivedQueries.md @@ -1,4 +1,4 @@ - + # Derived queries ## Semantic parts diff --git a/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/NamedQueries.md b/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/NamedQueries.md index adbb22af04..7e45cf0798 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/NamedQueries.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/NamedQueries.md @@ -1,4 +1,4 @@ - + # Named queries An alternative to using the `@Query` annotation on methods is specifying them in a separate `.properties` file. The default path for the file is `META-INF/arango-named-queries.properties` and can be changed with the `EnableArangoRepositories#namedQueriesLocation()` setting. The entries in the properties file must adhere to the following convention: `{simple entity name}.{method name} = {query}`. Let's assume we have the following repository interface: diff --git a/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/QueryMethods.md b/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/QueryMethods.md index 701fd3d9e9..ffa111b737 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/QueryMethods.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/QueryMethods.md @@ -1,4 +1,4 @@ - + # Query methods Queries using [ArangoDB Query Language (AQL)](https://docs.arangodb.com/current/AQL/index.html) can be supplied with the `@Query` annotation on methods. diff --git a/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/README.md b/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/README.md index 8d31e2f55b..f60125ba7e 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/README.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Repositories/Queries/README.md @@ -1,4 +1,4 @@ - + # Queries Spring Data ArangoDB supports three kinds of queries: diff --git a/Documentation/Books/Drivers/SpringData/Reference/Repositories/QueryByExample.md b/Documentation/Books/Drivers/SpringData/Reference/Repositories/QueryByExample.md index 1983f781ef..7ab142dddd 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Repositories/QueryByExample.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Repositories/QueryByExample.md @@ -1,4 +1,4 @@ - + # Query by example ## ArangoRepository.exists diff --git a/Documentation/Books/Drivers/SpringData/Reference/Repositories/README.md b/Documentation/Books/Drivers/SpringData/Reference/Repositories/README.md index 2ee9b0ad1f..6ea7ab39f1 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Repositories/README.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Repositories/README.md @@ -1,4 +1,4 @@ - + # Repositories Spring Data Commons provides a composable repository infrastructure which Spring Data ArangoDB is built on. These allow for interface-based composition of repositories consisting of provided default implementations for certain interfaces (like `CrudRepository`) and custom implementations for other methods. diff --git a/Documentation/Books/Drivers/SpringData/Reference/Template/CollectionManipulation.md b/Documentation/Books/Drivers/SpringData/Reference/Template/CollectionManipulation.md index 8a80b8bc26..96e4afecce 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Template/CollectionManipulation.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Template/CollectionManipulation.md @@ -1,4 +1,4 @@ - + # Manipulating the collection ## ArangoOperations.collection diff --git a/Documentation/Books/Drivers/SpringData/Reference/Template/DocumentManipulation.md b/Documentation/Books/Drivers/SpringData/Reference/Template/DocumentManipulation.md index ca88097f57..7bd87d5cf3 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Template/DocumentManipulation.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Template/DocumentManipulation.md @@ -1,4 +1,4 @@ - + # Manipulating documents ## ArangoOperations.exists diff --git a/Documentation/Books/Drivers/SpringData/Reference/Template/MultiDocumentManipulation.md b/Documentation/Books/Drivers/SpringData/Reference/Template/MultiDocumentManipulation.md index ca7dc95e4b..c67ed706aa 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Template/MultiDocumentManipulation.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Template/MultiDocumentManipulation.md @@ -1,4 +1,4 @@ - + # Manipulating multiple documents ## ArangoOperations.find diff --git a/Documentation/Books/Drivers/SpringData/Reference/Template/Queries.md b/Documentation/Books/Drivers/SpringData/Reference/Template/Queries.md index e981f20a01..fcc3230031 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Template/Queries.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Template/Queries.md @@ -1,4 +1,4 @@ - + ## ArangoOperations.query ``` @@ -73,7 +73,7 @@ Performs a database query using the given _query_ and _bindVars_, then returns a - **fullCount**: `Boolean` - If set to true and the query contains a LIMIT clause, then the result will have an extra attribute with the sub-attributes stats and fullCount, { ... , "extra": { "stats": { "fullCount": 123 } } }. The fullCount attribute will contain the number of documents in the result before the last top-level LIMIT in the query was applied. It can be used to count the number of documents that match certain filter criteria, but only return a subset of them, in one go. It is thus similar to MySQL's SQL_CALC_FOUND_ROWS hint. Note that setting the option will disable a few LIMIT optimizations and may lead to more documents being processed, and thus make queries run longer. Note that the fullCount attribute may only be present in the result if the query has a top-level LIMIT clause and the LIMIT clause is actually used in the query. + If set to true and the query contains a LIMIT clause, then the result will have an extra attribute with the sub-attributes stats and fullCount, { ... , "extra": { "stats": { "fullCount": 123 } } }. The fullCount attribute will contain the number of documents in the result before the last LIMIT in the query was applied. It can be used to count the number of documents that match certain filter criteria, but only return a subset of them, in one go. It is thus similar to MySQL's SQL_CALC_FOUND_ROWS hint. Note that setting the option will disable a few LIMIT optimizations and may lead to more documents being processed, and thus make queries run longer. Note that the fullCount attribute will only be present in the result if the query has a LIMIT clause and the LIMIT clause is actually used in the query. - **maxPlans**: `Integer` diff --git a/Documentation/Books/Drivers/SpringData/Reference/Template/README.md b/Documentation/Books/Drivers/SpringData/Reference/Template/README.md index 8f6fa623a2..6d24ed1f74 100644 --- a/Documentation/Books/Drivers/SpringData/Reference/Template/README.md +++ b/Documentation/Books/Drivers/SpringData/Reference/Template/README.md @@ -1,4 +1,4 @@ - + # Template With `ArangoTemplate` Spring Data ArangoDB offers a central support for interactions with the database over a rich feature set. It mostly offers the features from the ArangoDB Java driver with additional exception translation from the drivers exceptions to the Spring Data access exceptions inheriting the `DataAccessException` class. diff --git a/Documentation/Books/Manual/Administration/DC2DC/README.md b/Documentation/Books/Manual/Administration/DC2DC/README.md index 39deda5830..66cba25274 100644 --- a/Documentation/Books/Manual/Administration/DC2DC/README.md +++ b/Documentation/Books/Manual/Administration/DC2DC/README.md @@ -1,4 +1,4 @@ - + # Datacenter to datacenter replication administration {% hint 'info' %} @@ -104,10 +104,20 @@ arangosync stop sync \ --auth.password= ``` -The command will wait until synchronization has completely stopped before returning. +The command will first ensure that all shards in the receiving cluster are +completely in-sync with the shards in the sending cluster. +In order to achieve that, the sending cluster will be switched to read/only mode. +After the synchronization has stopped, the sending cluster will be switched +back to read/write mode. + +The command will then wait until synchronization has completely stopped before returning. If the synchronization is not completely stopped within a reasonable period (2 minutes by default) the command will fail. +If you do not want to wait for all shards in the receiving cluster to be +completely in-sync with the shards in the sending cluster, add an `--ensure-in-sync=false` +argument to the `stop sync` command. + If the source datacenter is no longer available it is not possible to stop synchronization in a graceful manner. If that happens abort the synchronization with the following command: diff --git a/Documentation/Books/Manual/Administration/Starter/README.md b/Documentation/Books/Manual/Administration/Starter/README.md index 8f31a7a42a..ba29c69d32 100644 --- a/Documentation/Books/Manual/Administration/Starter/README.md +++ b/Documentation/Books/Manual/Administration/Starter/README.md @@ -1,4 +1,4 @@ - + # ArangoDB Starter Administration This chapter documents administering the _ArangoDB Starter_. diff --git a/Documentation/Books/Manual/Administration/Starter/Recovery.md b/Documentation/Books/Manual/Administration/Starter/Recovery.md index 1a44fcf78e..3f22888e36 100644 --- a/Documentation/Books/Manual/Administration/Starter/Recovery.md +++ b/Documentation/Books/Manual/Administration/Starter/Recovery.md @@ -1,4 +1,4 @@ - + # ArangoDB Starter Recovery Procedure This procedure is intended to recover a cluster (that was started with the ArangoDB diff --git a/Documentation/Books/Manual/Administration/Starter/Removal.md b/Documentation/Books/Manual/Administration/Starter/Removal.md index 672322952b..1c612a329b 100644 --- a/Documentation/Books/Manual/Administration/Starter/Removal.md +++ b/Documentation/Books/Manual/Administration/Starter/Removal.md @@ -1,4 +1,4 @@ - + # ArangoDB Starter Removal Procedure This procedure is intended to remove a machine from a cluster diff --git a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Applicability.md b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Applicability.md index bdca383836..30d9db012f 100644 --- a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Applicability.md +++ b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Applicability.md @@ -1,4 +1,4 @@ - + # When to use it... and when not The _datacenter to datacenter replication_ is a good solution in all cases where diff --git a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Introduction.md b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Introduction.md index 81e568f5c9..3f909bb856 100644 --- a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Introduction.md +++ b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Introduction.md @@ -1,4 +1,4 @@ - + # Introduction At some point in the grows of a database, there comes a need for replicating it diff --git a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Limitations.md b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Limitations.md index f605b71429..c733da4771 100644 --- a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Limitations.md +++ b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Limitations.md @@ -1,4 +1,4 @@ - + Limitations =========== diff --git a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/README.md b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/README.md index eb58d2b726..ccecfcb843 100644 --- a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/README.md +++ b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/README.md @@ -1,4 +1,4 @@ - + # Datacenter to datacenter replication {% hint 'info' %} diff --git a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Requirements.md b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Requirements.md index 66852c6448..0ab4e49632 100644 --- a/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Requirements.md +++ b/Documentation/Books/Manual/Architecture/DeploymentModes/DC2DC/Requirements.md @@ -1,9 +1,10 @@ - + # Requirements To use _datacenter to datacenter replication_ you need the following: -- Two datacenters, each running an ArangoDB Enterprise Edition cluster, version 3.3 or higher. +- Two datacenters, each running an ArangoDB Enterprise Edition cluster, + version 3.3 or higher, using the RocksDB storage engine. - A network connection between both datacenters with accessible endpoints for several components (see individual components for details). - TLS certificates for ArangoSync master instances (can be self-signed). diff --git a/Documentation/Books/Manual/Deployment/ActiveFailover/UsingTheStarter.md b/Documentation/Books/Manual/Deployment/ActiveFailover/UsingTheStarter.md index 67ca12e4bf..ae8a47d19c 100644 --- a/Documentation/Books/Manual/Deployment/ActiveFailover/UsingTheStarter.md +++ b/Documentation/Books/Manual/Deployment/ActiveFailover/UsingTheStarter.md @@ -1,4 +1,4 @@ - + Using the ArangoDB Starter ========================== diff --git a/Documentation/Books/Manual/Deployment/ArangoDBStarter/README.md b/Documentation/Books/Manual/Deployment/ArangoDBStarter/README.md index 9109df465b..516e2802c5 100644 --- a/Documentation/Books/Manual/Deployment/ArangoDBStarter/README.md +++ b/Documentation/Books/Manual/Deployment/ArangoDBStarter/README.md @@ -1,4 +1,4 @@ - + Deploying using the ArangoDB Starter ==================================== diff --git a/Documentation/Books/Manual/Deployment/Cluster/UsingTheStarter.md b/Documentation/Books/Manual/Deployment/Cluster/UsingTheStarter.md index b006a9d772..bfeb64a054 100644 --- a/Documentation/Books/Manual/Deployment/Cluster/UsingTheStarter.md +++ b/Documentation/Books/Manual/Deployment/Cluster/UsingTheStarter.md @@ -1,4 +1,4 @@ - + Using the ArangoDB Starter ========================== diff --git a/Documentation/Books/Manual/Deployment/DC2DC/ArangoSyncMaster.md b/Documentation/Books/Manual/Deployment/DC2DC/ArangoSyncMaster.md index 7e06be9d95..ed26aaab34 100644 --- a/Documentation/Books/Manual/Deployment/DC2DC/ArangoSyncMaster.md +++ b/Documentation/Books/Manual/Deployment/DC2DC/ArangoSyncMaster.md @@ -1,4 +1,4 @@ - + # ArangoSync Master The _ArangoSync Master_ is responsible for managing all synchronization, creating diff --git a/Documentation/Books/Manual/Deployment/DC2DC/ArangoSyncWorkers.md b/Documentation/Books/Manual/Deployment/DC2DC/ArangoSyncWorkers.md index b12f60083d..bcb7e70f01 100644 --- a/Documentation/Books/Manual/Deployment/DC2DC/ArangoSyncWorkers.md +++ b/Documentation/Books/Manual/Deployment/DC2DC/ArangoSyncWorkers.md @@ -1,4 +1,4 @@ - + # ArangoSync Workers The _ArangoSync Worker_ is responsible for executing synchronization tasks. diff --git a/Documentation/Books/Manual/Deployment/DC2DC/Cluster.md b/Documentation/Books/Manual/Deployment/DC2DC/Cluster.md index a089df5dc2..e59928975d 100644 --- a/Documentation/Books/Manual/Deployment/DC2DC/Cluster.md +++ b/Documentation/Books/Manual/Deployment/DC2DC/Cluster.md @@ -1,4 +1,4 @@ - + # ArangoDB cluster There are several ways to start an ArangoDB cluster. In this section we will focus diff --git a/Documentation/Books/Manual/Deployment/DC2DC/KafkaZookeeper.md b/Documentation/Books/Manual/Deployment/DC2DC/KafkaZookeeper.md index d2a7dbbe5b..43746ad89f 100644 --- a/Documentation/Books/Manual/Deployment/DC2DC/KafkaZookeeper.md +++ b/Documentation/Books/Manual/Deployment/DC2DC/KafkaZookeeper.md @@ -1,4 +1,4 @@ - + # Kafka & Zookeeper - How to deploy Zookeeper diff --git a/Documentation/Books/Manual/Deployment/DC2DC/PrometheusGrafana.md b/Documentation/Books/Manual/Deployment/DC2DC/PrometheusGrafana.md index 6461d84cc3..8a25f45009 100644 --- a/Documentation/Books/Manual/Deployment/DC2DC/PrometheusGrafana.md +++ b/Documentation/Books/Manual/Deployment/DC2DC/PrometheusGrafana.md @@ -1,4 +1,4 @@ - + # Prometheus & Grafana (optional) _ArangoSync_ provides metrics in a format supported by [Prometheus](https://prometheus.io). diff --git a/Documentation/Books/Manual/Deployment/DC2DC/README.md b/Documentation/Books/Manual/Deployment/DC2DC/README.md index 92035d60ee..36d8847b89 100644 --- a/Documentation/Books/Manual/Deployment/DC2DC/README.md +++ b/Documentation/Books/Manual/Deployment/DC2DC/README.md @@ -1,4 +1,4 @@ - + # Datacenter to datacenter replication deployment {% hint 'info' %} diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Authentication.md b/Documentation/Books/Manual/Deployment/Kubernetes/Authentication.md index 1dd4bbc58d..75ea59bef6 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/Authentication.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Authentication.md @@ -1,4 +1,4 @@ - + # Authentication The ArangoDB Kubernetes Operator will by default create ArangoDB deployments diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/ConfigAndSecrets.md b/Documentation/Books/Manual/Deployment/Kubernetes/ConfigAndSecrets.md index a7ff858d51..7f57e56d66 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/ConfigAndSecrets.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/ConfigAndSecrets.md @@ -1,4 +1,4 @@ - + # Configuration & secrets An ArangoDB cluster has lots of configuration options. diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Dashboards.md b/Documentation/Books/Manual/Deployment/Kubernetes/Dashboards.md new file mode 100644 index 0000000000..09da64d322 --- /dev/null +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Dashboards.md @@ -0,0 +1,74 @@ + +# Operator Dashboards + +The ArangoDB Kubernetes Operator can create a dashboard for each type of +resource it supports. These dashboards are intended to give an overview of +the created resources, their state and instructions on how to modify those resources. + +The dashboards do not provide direct means to modify the resources. +All modifications are done using `kubectl` commands (which are provided by the dashboards) +so the standard security of your Kubernetes cluster is not bypassed. + +## Exposing the dashboards + +For each resource type (deployment, deployment replication & local storage) operator +a `Service` is created that serves the dashboard internally in the Kubernetes cluster. +To expose a dashboard outside the Kubernetes cluster, run a `kubecty expose` +command like this: + +```bash +kubectl expose service --type=LoadBalancer \ + --port=8528 --target-port=8528 \ + --name= --namespace= +``` + +Replace `` with: + +- `arango-deployment-operator` for the ArangoDeployment operator dashboard. +- `arango-deployment-replication-operator` for the ArangoDeploymentReplication + operator dashboard. +- `arango-storage-operator` for the ArangoLocalStorage operator dashboard. + (use 'kube-system' namespace) + +Replace `` with the name of the namespace that the operator is in. +This will often be `default`. + +This will create an additional `Service` of type `LoadBalancer` that copies +the selector from the existing `Service`. +If your Kubernetes cluster does not support loadbalancers, +use `--type=NodePort` instead. + +Run the following command to inspect your new service and look for the +loadbalancer IP/host address (or nodeport). + +```bash +kubectl get service --namespace= +``` + +This will result in something like this: + +```bash +$ kubectl get service arango-storage-operator-lb --namespace=kube-system +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +arango-storage-operator-lb LoadBalancer 10.103.30.24 192.168.31.11 8528:30655/TCP 1d +``` + +## Authentication + +While the dashboards do not provide any means to directly modify resources, +they still show sensitive information (e.g. TLS certificates). +Therefore the dashboards require a username+password for authentications. + +The username+password pair is configured in a generic Kubernetes `Secret` named `arangodb-operator-dashboard`, found in the namespace where the operator runs. + +To create such a secret, run this: + +```bash +kubectl create secret generic \ + arangodb-operator-dashboard --namespace= \ + --from-literal=username= \ + --from-literal=password= +``` + +Until such a `Secret` is found, the operator will respond with a status `401` +to any request related to the dashboard. diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/DeploymentReplicationResource.md b/Documentation/Books/Manual/Deployment/Kubernetes/DeploymentReplicationResource.md index f1d1d8263f..e8f59f20f0 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/DeploymentReplicationResource.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/DeploymentReplicationResource.md @@ -1,4 +1,4 @@ - + # ArangoDeploymentReplication Custom Resource The ArangoDB Replication Operator creates and maintains ArangoDB diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/DeploymentResource.md b/Documentation/Books/Manual/Deployment/Kubernetes/DeploymentResource.md index 6759991f0d..479f82511d 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/DeploymentResource.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/DeploymentResource.md @@ -1,4 +1,4 @@ - + # ArangoDeployment Custom Resource The ArangoDB Deployment Operator creates and maintains ArangoDB deployments diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/DriverConfiguration.md b/Documentation/Books/Manual/Deployment/Kubernetes/DriverConfiguration.md index d56cfec877..b498675bf2 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/DriverConfiguration.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/DriverConfiguration.md @@ -1,4 +1,4 @@ - + # Configuring your driver for ArangoDB access In this chapter you'll learn how to configure a driver for accessing diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Helm.md b/Documentation/Books/Manual/Deployment/Kubernetes/Helm.md new file mode 100644 index 0000000000..7bd93e2bb6 --- /dev/null +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Helm.md @@ -0,0 +1,92 @@ + +# Using the ArangoDB Kubernetes Operator with Helm + +[`Helm`](https://www.helm.sh/) is a package manager for Kubernetes, which enables +you to install various packages (include the ArangoDB Kubernetes Operator) +into your Kubernetes cluster. + +The benefit of `helm` (in the context of the ArangoDB Kubernetes Operator) +is that it allows for a lot of flexibility in how you install the operator. +For example you can install the operator in a namespace other than +`default`. + +## Charts + +The ArangoDB Kubernetes Operator is contained in two `helm` charts: + +- `kube-arangodb` which contains the operator for the `ArangoDeployment` + and `ArangoDeploymentReplication` resource types. +- `kube-arangodb-storage` which contains the operator for the `ArangoLocalStorage` + resource type. + +The `kube-arangodb-storage` only has to be installed if your Kubernetes cluster +does not already provide `StorageClasses` that use locally attached SSDs. + +## Configurable values for ArangoDB Kubernetes Operator + +The following values can be configured when installing the +ArangoDB Kubernetes Operator with `helm`. + +Values are passed to `helm` using an `--set==` argument passed +to the `helm install` or `helm upgrade` command. + +### Values applicable to both charts + +| Key | Type | Description +|-------------------|--------|-----| +| Image | string | Override the docker image used by the operators +| ImagePullPolicy | string | Override the image pull policy used by the operators. See [Updating Images](https://kubernetes.io/docs/concepts/containers/images/#updating-images) for details. +| RBAC.Create | bool | Set to `true` (default) to create roles & role bindings. + +### Values applicable to the `kube-arangodb` chart + +| Key | Type | Description +|-------------------|--------|-----| +| Deployment.Create | bool | Set to `true` (default) to deploy the `ArangoDeployment` operator +| Deployment.User.ServiceAccountName | string | Name of the `ServiceAccount` that is the subject of the `RoleBinding` of users of the `ArangoDeployment` operator +| Deployment.Operator.ServiceAccountName | string | Name of the `ServiceAccount` used to run the `ArangoDeployment` operator +| Deployment.Operator.ServiceType | string | Type of `Service` created for the dashboard of the `ArangoDeployment` operator +| Deployment.AllowChaos | bool | Set to `true` to allow the introduction of chaos. **Only use for testing, never for production!** Defaults to `false`. +| DeploymentReplication.Create | bool | Set to `true` (default) to deploy the `ArangoDeploymentReplication` operator +| DeploymentReplication.User.ServiceAccountName | string | Name of the `ServiceAccount` that is the subject of the `RoleBinding` of users of the `ArangoDeploymentReplication` operator +| DeploymentReplication.Operator.ServiceAccountName | string | Name of the `ServiceAccount` used to run the `ArangoDeploymentReplication` operator +| DeploymentReplication.Operator.ServiceType | string | Type of `Service` created for the dashboard of the `ArangoDeploymentReplication` operator + +### Values applicable to the `kube-arangodb-storage` chart + +| Key | Type | Description +|-------------------|--------|-----| +| Storage.User.ServiceAccountName | string | Name of the `ServiceAccount` that is the subject of the `RoleBinding` of users of the `ArangoLocalStorage` operator +| Storage.Operator.ServiceAccountName | string | Name of the `ServiceAccount` used to run the `ArangoLocalStorage` operator +| Storage.Operator.ServiceType | string | Type of `Service` created for the dashboard of the `ArangoLocalStorage` operator + +## Alternate namespaces + +The `kube-arangodb` chart supports deployment into a non-default namespace. + +To install the `kube-arangodb` chart is a non-default namespace, use the `--namespace` +argument like this. + +```bash +helm install --namespace=mynamespace kube-arangodb.tgz +``` + +Note that since the operators claim exclusive access to a namespace, you can +install the `kube-arangodb` chart in a namespace once. +You can install the `kube-arangodb` chart in multiple namespaces. To do so, run: + +```bash +helm install --namespace=namespace1 kube-arangodb.tgz +helm install --namespace=namespace2 kube-arangodb.tgz +``` + +The `kube-arangodb-storage` chart is always installed in the `kube-system` namespace. + +## Common problems + +### Error: no available release name found + +This error is given by `helm install ...` in some cases where it has +insufficient permissions to install charts. + +For various ways to work around this problem go to [this Stackoverflow article](https://stackoverflow.com/questions/43499971/helm-error-no-available-release-name-found). diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Metrics.md b/Documentation/Books/Manual/Deployment/Kubernetes/Metrics.md index 3aea330c14..7006f912d9 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/Metrics.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Metrics.md @@ -1,4 +1,4 @@ - + # Metrics The ArangoDB Kubernetes Operator (`kube-arangodb`) exposes metrics of diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/README.md b/Documentation/Books/Manual/Deployment/Kubernetes/README.md index 78d79e4923..8dc94b5d50 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/README.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/README.md @@ -1,4 +1,4 @@ - + # ArangoDB Kubernetes Operator The ArangoDB Kubernetes Operator (`kube-arangodb`) is a set of operators @@ -19,4 +19,4 @@ Each of these uses involves a different custom resource. Continue with [Using the ArangoDB Kubernetes Operator](./Usage.md) to learn how to install the ArangoDB Kubernetes operator and create -your first deployment. +your first deployment. \ No newline at end of file diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Scaling.md b/Documentation/Books/Manual/Deployment/Kubernetes/Scaling.md index a509879e03..c435a64290 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/Scaling.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Scaling.md @@ -1,4 +1,4 @@ - + # Scaling The ArangoDB Kubernetes Operator supports up and down scaling of diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/ServicesAndLoadBalancer.md b/Documentation/Books/Manual/Deployment/Kubernetes/ServicesAndLoadBalancer.md index cd8b44ab9b..662c71796f 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/ServicesAndLoadBalancer.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/ServicesAndLoadBalancer.md @@ -1,4 +1,4 @@ - + # Services and load balancer The ArangoDB Kubernetes Operator will create services that can be used to diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Storage.md b/Documentation/Books/Manual/Deployment/Kubernetes/Storage.md index 5d841f847d..448ac7a6f0 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/Storage.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Storage.md @@ -1,4 +1,4 @@ - + # Storage An ArangoDB cluster relies heavily on fast persistent storage. diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/StorageResource.md b/Documentation/Books/Manual/Deployment/Kubernetes/StorageResource.md index 08eb00b320..e680ac40a0 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/StorageResource.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/StorageResource.md @@ -1,4 +1,4 @@ - + # ArangoLocalStorage Custom Resource The ArangoDB Storage Operator creates and maintains ArangoDB diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Tls.md b/Documentation/Books/Manual/Deployment/Kubernetes/Tls.md index 4f18eebcb8..05a9bf9e5c 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/Tls.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Tls.md @@ -1,4 +1,4 @@ - + # Secure connections (TLS) The ArangoDB Kubernetes Operator will by default create ArangoDB deployments diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Troubleshooting.md b/Documentation/Books/Manual/Deployment/Kubernetes/Troubleshooting.md index c74da001e5..e384fad7f6 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/Troubleshooting.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Troubleshooting.md @@ -1,4 +1,4 @@ - + # Troubleshooting While Kubernetes and the ArangoDB Kubernetes operator will automatically diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Upgrading.md b/Documentation/Books/Manual/Deployment/Kubernetes/Upgrading.md index 7f048520df..8f48a5e98e 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/Upgrading.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Upgrading.md @@ -1,4 +1,4 @@ - + # Upgrading The ArangoDB Kubernetes Operator supports upgrading an ArangoDB from @@ -39,4 +39,4 @@ kubectl apply -f examples/yourUpdatedDeployment.yaml ## See also -- [Scaling](./Scaling.md) +- [Scaling](./Scaling.md) \ No newline at end of file diff --git a/Documentation/Books/Manual/Deployment/Kubernetes/Usage.md b/Documentation/Books/Manual/Deployment/Kubernetes/Usage.md index 52b660ee8a..0d51d87a80 100644 --- a/Documentation/Books/Manual/Deployment/Kubernetes/Usage.md +++ b/Documentation/Books/Manual/Deployment/Kubernetes/Usage.md @@ -1,4 +1,4 @@ - + # Using the ArangoDB Kubernetes Operator ## Installation @@ -6,11 +6,41 @@ The ArangoDB Kubernetes Operator needs to be installed in your Kubernetes cluster first. -To do so, run (replace `` with the version of the operator that you want to install): +If you have `Helm` available, we recommend installation using `Helm`. + +### Installation with Helm + +To install the ArangoDB Kubernetes Operator with [`helm`](https://www.helm.sh/), +run (replace `` with the version of the operator that you want to install): + +```bash +export URLPREFIX=https://github.com/arangodb/kube-arangodb/releases/download/ +helm install $URLPREFIX/kube-arangodb.tgz +``` + +This installs operators for the `ArangoDeployment` and `ArangoDeploymentReplication` +resource types. + +If you want to avoid the installation of the operator for the `ArangoDeploymentReplication` +resource type, add `--set=DeploymentReplication.Create=false` to the `helm install` +command. + +To use `ArangoLocalStorage` resources, also run: + +```bash +helm install $URLPREFIX/kube-arangodb-storage.tgz +``` + +For more information on installing with `Helm` and how to customize an installation, +see [Using the ArangoDB Kubernetes Operator with Helm](./Helm.md). + +### Installation with Kubectl + +To install the ArangoDB Kubernetes Operator without `Helm`, +run (replace `` with the version of the operator that you want to install): ```bash export URLPREFIX=https://raw.githubusercontent.com/arangodb/kube-arangodb//manifests -kubectl apply -f $URLPREFIX/crd.yaml kubectl apply -f $URLPREFIX/arango-deployment.yaml ``` @@ -61,6 +91,14 @@ If you want to keep your data, make sure to create a backup before removing the To remove the entire ArangoDB Kubernetes Operator, remove all clusters first and then remove the operator by running: +```bash +helm delete +# If `ArangoLocalStorage` operator is installed +helm delete +``` + +or when you used `kubectl` to install the operator, run: + ```bash kubectl delete deployment arango-deployment-operator # If `ArangoLocalStorage` operator is installed @@ -74,3 +112,4 @@ kubectl delete deployment arango-deployment-replication-operator - [Driver configuration](./DriverConfiguration.md) - [Scaling](./Scaling.md) - [Upgrading](./Upgrading.md) +- [Using the ArangoDB Kubernetes Operator with Helm](./Helm.md) \ No newline at end of file diff --git a/Documentation/Books/Manual/Deployment/SingleInstance/UsingTheStarter.md b/Documentation/Books/Manual/Deployment/SingleInstance/UsingTheStarter.md index e1fff576e5..1b1c9f56c5 100644 --- a/Documentation/Books/Manual/Deployment/SingleInstance/UsingTheStarter.md +++ b/Documentation/Books/Manual/Deployment/SingleInstance/UsingTheStarter.md @@ -1,4 +1,4 @@ - + Using the ArangoDB Starter ========================== diff --git a/Documentation/Books/Manual/Monitoring/DC2DC/README.md b/Documentation/Books/Manual/Monitoring/DC2DC/README.md index a03e65ee31..73bce37bc3 100644 --- a/Documentation/Books/Manual/Monitoring/DC2DC/README.md +++ b/Documentation/Books/Manual/Monitoring/DC2DC/README.md @@ -1,4 +1,4 @@ - + # Monitoring datacenter to datacenter replication {% hint 'info' %} diff --git a/Documentation/Books/Manual/Programs/FoxxCLI/Details.md b/Documentation/Books/Manual/Programs/FoxxCLI/Details.md index 74492613d5..238e955916 100644 --- a/Documentation/Books/Manual/Programs/FoxxCLI/Details.md +++ b/Documentation/Books/Manual/Programs/FoxxCLI/Details.md @@ -1,4 +1,4 @@ - + # Foxx CLI Details ## Install diff --git a/Documentation/Books/Manual/Programs/FoxxCLI/README.md b/Documentation/Books/Manual/Programs/FoxxCLI/README.md index d6b867d606..b5e378bc50 100644 --- a/Documentation/Books/Manual/Programs/FoxxCLI/README.md +++ b/Documentation/Books/Manual/Programs/FoxxCLI/README.md @@ -1,4 +1,4 @@ - + # Foxx CLI Foxx CLI is command line tool for managing and developing ArangoDB diff --git a/Documentation/Books/Manual/Programs/Starter/Architecture.md b/Documentation/Books/Manual/Programs/Starter/Architecture.md index 5903057786..33526cabf7 100644 --- a/Documentation/Books/Manual/Programs/Starter/Architecture.md +++ b/Documentation/Books/Manual/Programs/Starter/Architecture.md @@ -1,4 +1,4 @@ - + # ArangoDB Starter Architecture ## What does the Starter do diff --git a/Documentation/Books/Manual/Programs/Starter/Options.md b/Documentation/Books/Manual/Programs/Starter/Options.md index 2099653c9f..cad4cd5cf6 100644 --- a/Documentation/Books/Manual/Programs/Starter/Options.md +++ b/Documentation/Books/Manual/Programs/Starter/Options.md @@ -1,4 +1,4 @@ - + # Option reference The ArangoDB Starter provides a lot of options to control various aspects diff --git a/Documentation/Books/Manual/Programs/Starter/README.md b/Documentation/Books/Manual/Programs/Starter/README.md index e1b393af78..4d31165520 100644 --- a/Documentation/Books/Manual/Programs/Starter/README.md +++ b/Documentation/Books/Manual/Programs/Starter/README.md @@ -1,4 +1,4 @@ - + # ArangoDB Starter This chapter documents the _ArangoDB Starter_. diff --git a/Documentation/Books/Manual/Programs/Starter/Security.md b/Documentation/Books/Manual/Programs/Starter/Security.md index 821f6c45cc..8fb3c6deae 100644 --- a/Documentation/Books/Manual/Programs/Starter/Security.md +++ b/Documentation/Books/Manual/Programs/Starter/Security.md @@ -1,4 +1,4 @@ - + # Security Securing an ArangoDB deployment involves encrypting its connections and diff --git a/Documentation/Books/Manual/SUMMARY.md b/Documentation/Books/Manual/SUMMARY.md index 1dbef8dace..fc51b3f379 100644 --- a/Documentation/Books/Manual/SUMMARY.md +++ b/Documentation/Books/Manual/SUMMARY.md @@ -15,12 +15,13 @@ * [Coming from SQL](GettingStarted/ComingFromSql.md) * [Next Steps](GettingStarted/NextSteps.md) * [Tutorials](Tutorials/README.md) -# https://@github.com/arangodb-helper/arangodb.git;arangodb;docs/Manual;;/ + * [ArangoDB Starter](Tutorials/Starter/README.md) -# https://@github.com/arangodb/arangosync.git;arangosync;docs/Manual;;/ + * [Datacenter to datacenter Replication](Tutorials/DC2DC/README.md) -# https://@github.com/arangodb/kube-arangodb.git;kube-arangodb;docs/Manual;;/ + * [Kubernetes](Tutorials/Kubernetes/README.md) + * [GKE](Tutorials/Kubernetes/GKE.md) * [DC2DC on Kubernetes](Tutorials/Kubernetes/DC2DC.md) * [Programs & Tools](Programs/README.md) * [ArangoDB Server](Programs/Arangod/README.md) @@ -62,7 +63,7 @@ * [Examples](Programs/Arangosh/Examples.md) * [Details](Programs/Arangosh/Details.md) * [Options](Programs/Arangosh/Options.md) -# https://@github.com//arangodb-helper/arangodb.git;arangodb;docs/Manual;;/ + * [ArangoDB Starter](Programs/Starter/README.md) * [Options](Programs/Starter/Options.md) * [Security](Programs/Starter/Security.md) @@ -90,7 +91,7 @@ * [Options](Programs/Arangoinspect/Options.md) * [Datafile Debugger](Programs/Arango-dfdb/README.md) * [Examples](Programs/Arango-dfdb/Examples.md) -# https://@github.com/arangodb/foxx-cli.git;foxx-cli;docs/Manual;;/ + * [Foxx CLI](Programs/FoxxCLI/README.md) * [Details](Programs/FoxxCLI/Details.md) @@ -166,7 +167,7 @@ * [Architecture](Architecture/DeploymentModes/Cluster/Architecture.md) * [Data models](Architecture/DeploymentModes/Cluster/DataModels.md) * [Limitations](Architecture/DeploymentModes/Cluster/Limitations.md) -# https://@github.com/arangodb/arangosync.git;arangosync;docs/Manual;;/ + * [Datacenter to datacenter replication](Architecture/DeploymentModes/DC2DC/README.md) * [Introduction](Architecture/DeploymentModes/DC2DC/Introduction.md) * [Applicability](Architecture/DeploymentModes/DC2DC/Applicability.md) @@ -257,7 +258,7 @@ * [Manual Start](Deployment/Cluster/ManualStart.md) * [Kubernetes](Deployment/Cluster/Kubernetes.md) * [Mesos, DC/OS](Deployment/Cluster/Mesos.md) - # https://@github.com/arangodb/arangosync.git;arangosync;docs/Manual;;/ + * [Multiple Datacenters](Deployment/DC2DC/README.md) * [Cluster](Deployment/DC2DC/Cluster.md) * [ArangoSync Master](Deployment/DC2DC/ArangoSyncMaster.md) @@ -269,11 +270,13 @@ * [Manually](Deployment/Manually/README.md) * [ArangoDB Starter](Deployment/ArangoDBStarter/README.md) * [Docker](Deployment/Docker/README.md) - # https://@github.com/arangodb/kube-arangodb.git;kube-arangodb;docs/Manual;;/ + * [Kubernetes](Deployment/Kubernetes/README.md) * [Using the Operator](Deployment/Kubernetes/Usage.md) + * [Dashboards](Deployment/Kubernetes/Dashboards.md) * [Deployment Resource Reference](Deployment/Kubernetes/DeploymentResource.md) * [Driver Configuration](Deployment/Kubernetes/DriverConfiguration.md) + * [Helm](Deployment/Kubernetes/Helm.md) * [Authentication](Deployment/Kubernetes/Authentication.md) * [Scaling](Deployment/Kubernetes/Scaling.md) * [Upgrading](Deployment/Kubernetes/Upgrading.md) @@ -328,9 +331,9 @@ * [Syncing Collections](Administration/MasterSlave/SyncingCollections.md) * [Active Failover](Administration/ActiveFailover/README.md) * [Cluster](Administration/Cluster/README.md) -# https://@github.com/arangodb/arangosync.git;arangosync;docs/Manual;;/ + * [Datacenter to datacenter replication](Administration/DC2DC/README.md) -# https://@github.com/arangodb-helper/arangodb.git;arangodb;docs/Manual;;/ + * [ArangoDB Starter Administration](Administration/Starter/README.md) * [ArangoDB Starter Removal Procedure](Administration/Starter/Removal.md) * [ArangoDB Starter Recovery Procedure](Administration/Starter/Recovery.md) @@ -340,19 +343,19 @@ * [Auditing](Security/Auditing/README.md) * [Configuration](Security/Auditing/AuditConfiguration.md) * [Events](Security/Auditing/AuditEvents.md) -# https://@github.com/arangodb-helper/arangodb.git;arangodb;docs/Manual;;/ + * [Securing Starter Deployments](Security/Starter/README.md) -# https://@github.com/arangodb/arangosync.git;arangosync;docs/Manual;;/ + * [Datacenter to datacenter replication](Security/DC2DC/README.md) * [Monitoring](Monitoring/README.md) -# https://@github.com/arangodb/arangosync.git;arangosync;docs/Manual;;/ + * [Datacenter to datacenter replication](Monitoring/DC2DC/README.md) * [Troubleshooting](Troubleshooting/README.md) * [arangod](Troubleshooting/Arangod.md) * [Emergency Console](Troubleshooting/EmergencyConsole.md) * [Cluster](Troubleshooting/Cluster/README.md) * [Agency Dump](Troubleshooting/Cluster/AgencyDump.md) -# https://@github.com/arangodb/arangosync.git;arangosync;docs/Manual;;/ + * [Datacenter to datacenter replication](Troubleshooting/DC2DC/README.md) --- diff --git a/Documentation/Books/Manual/Security/DC2DC/README.md b/Documentation/Books/Manual/Security/DC2DC/README.md index a3a03ee53e..ab12d1f11a 100644 --- a/Documentation/Books/Manual/Security/DC2DC/README.md +++ b/Documentation/Books/Manual/Security/DC2DC/README.md @@ -1,4 +1,4 @@ - + # Datacenter to datacenter Security {% hint 'info' %} diff --git a/Documentation/Books/Manual/Security/Starter/README.md b/Documentation/Books/Manual/Security/Starter/README.md index 0ff0edf6dd..1af555414b 100644 --- a/Documentation/Books/Manual/Security/Starter/README.md +++ b/Documentation/Books/Manual/Security/Starter/README.md @@ -1,4 +1,4 @@ - + Securing Starter Deployments ============================ diff --git a/Documentation/Books/Manual/Troubleshooting/DC2DC/README.md b/Documentation/Books/Manual/Troubleshooting/DC2DC/README.md index f0eb0c65c3..5cb85bebda 100644 --- a/Documentation/Books/Manual/Troubleshooting/DC2DC/README.md +++ b/Documentation/Books/Manual/Troubleshooting/DC2DC/README.md @@ -1,4 +1,4 @@ - + # Troubleshooting datacenter to datacenter replication {% hint 'info' %} diff --git a/Documentation/Books/Manual/Tutorials/DC2DC/README.md b/Documentation/Books/Manual/Tutorials/DC2DC/README.md index cee1cc599b..a8d1875065 100644 --- a/Documentation/Books/Manual/Tutorials/DC2DC/README.md +++ b/Documentation/Books/Manual/Tutorials/DC2DC/README.md @@ -1,4 +1,4 @@ - + # Datacenter to datacenter Replication {% hint 'info' %} @@ -72,7 +72,8 @@ ArangoSync is not a good solution when one of the following applies: To use ArangoSync you need the following: -- Two datacenters, each running an ArangoDB Enterprise Edition cluster, version 3.3 or higher. +- Two datacenters, each running an ArangoDB Enterprise Edition cluster, + version 3.3 or higher, using the RocksDB storage engine. - A network connection between both datacenters with accessible endpoints for several components (see individual components for details). - TLS certificates for ArangoSync master instances (can be self-signed). @@ -103,12 +104,12 @@ consult the [reference manual](../../Deployment/DC2DC/README.md). ### ArangoDB cluster Datacenter to datacenter replication requires an ArangoDB cluster in both data centers, -configured with the RocksDB storage engine. +configured with the `rocksdb` storage engine. Since the cluster agents are so critical to the availability of both the ArangoDB and the ArangoSync cluster, it is recommended to run agents on dedicated machines. Consider these machines "pets". -Coordinators and dbservers can be deployed of other machines that should be considered "cattle". +Coordinators and DBServers can be deployed on other machines that should be considered "cattle". ### Sync Master @@ -135,7 +136,7 @@ Consider these machines "pets". The Sync Worker is responsible for executing synchronization tasks.
For optimal performance at least 1 worker instance must be placed on -every machine that has an ArangoDB `dbserver` running. This ensures that tasks +every machine that has an ArangoDB DBServer running. This ensures that tasks can be executed with minimal network traffic outside of the machine. Since sync workers will automatically stop once their TLS server certificate expires @@ -147,7 +148,7 @@ down for a restart. The sync worker must be reachable on a TCP port 8729 (default). This port must be reachable from inside the datacenter (by sync masters). -The sync workers should be run on all machines that also contain an ArangoDB dbserver. +The sync workers should be run on all machines that also contain an ArangoDB DBServer. The sync worker can be memory intensive when running lots of databases & collections. Consider these machines "cattle". diff --git a/Documentation/Books/Manual/Tutorials/Kubernetes/DC2DC.md b/Documentation/Books/Manual/Tutorials/Kubernetes/DC2DC.md index fe7cfd3a2b..77063f90cd 100644 --- a/Documentation/Books/Manual/Tutorials/Kubernetes/DC2DC.md +++ b/Documentation/Books/Manual/Tutorials/Kubernetes/DC2DC.md @@ -1,4 +1,4 @@ - + # Start ArangoDB Cluster to Cluster Synchronization on Kubernetes This tutorial guides you through the steps needed to configure diff --git a/Documentation/Books/Manual/Tutorials/Kubernetes/GKE.md b/Documentation/Books/Manual/Tutorials/Kubernetes/GKE.md new file mode 100644 index 0000000000..6ddac82d24 --- /dev/null +++ b/Documentation/Books/Manual/Tutorials/Kubernetes/GKE.md @@ -0,0 +1,120 @@ + +# Start ArangoDB on Google Kubernetes Engine in 5 minutes + +In this guide you'll learn how to run ArangoDB on Google Kubernetes Engine (GKE). + +## Create a Kubernetes cluster + +In order to run ArangoDB on GKE you first need to create a Kubernetes cluster. + +To do so, go to the GKE console. +You'll find a list of existing clusters (initially empty). + +![clusters](./gke-clusters.png) + +Click on `CREATE CLUSTER`. + +In the form that follows, enter information as seen in the screenshot below. + +![create a cluser](./gke-create-cluster.png) + +We've succesfully ran clusters with 4 `1 vCPU` nodes or 3 `2 vCPU` nodes. +Smaller node configurations will likely lead to unschedulable `Pods`. + +Once you click `Create`, you'll return to the list of clusters and your +new cluster will be listed there. + +![with new cluster](./gke-clusters-added.png) + +It will take a few minutes for the cluster to be created. + +Once you're cluster is ready, a `Connect` button will appear in the list. + +![cluster is ready](./gke-clusters-ready.png) + +## Getting access to your Kubernetes cluster + +Once your cluster is ready you must get access to it. +The standard `Connect` button provided by GKE will give you access with only limited +permissions. Since the Kubernetes operator also requires some cluster wide +permissions, you need "administrator" permissions. + +To get these permissions, do the following. + +Prepare your `~/.kube/config` with the following content: + +```yaml +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: + server: https:// + name: my_cluster +contexts: +- context: + cluster: my_cluster + user: my_cluster + name: my_cluster +current-context: my_cluster +kind: Config +preferences: {} +users: +- name: my_cluster + user: + username: admin + password: +``` + +Click on the `Edit` button (pencil image) next to your cluster. +This will lead you to the following page. + +![edit cluster](./gke-edit-cluster.png) + +Copy the `Endpoint` IP address and paste it after `server: https://`. + +The click on `Show credentials`. +The following popup will appear. + +![show credentials](./gke-show-credentials.png) + +Copy the `Password` and paste it after `password:`. + +Close the popup and then return to the cluster list. + +Click on `Connect` next to your cluster. +The following popup will appear. + +![connect to cluster](./gke-connect-to-cluster.png) + +Click on `Run in Cloud Shell`. +It will take some time to launch a shell (in your browser). + +Once ready, run the `gcloud` command that is already prepare in your commandline. + +The run `cat ~/.kube/config` and copy the line that starts with `certificate-authority-data:`. +Override the corresponding line in your local `~/.kube.config` file. + +You should now be able to access your cluster using `kubectl`. + +To verify try a command like: + +```bash +kubectl get pods --all-namespaces +``` + +## Installing `kube-arangodb` + +You can now install the ArangoDB Kubernetes operator in your Kubernetes cluster +on GKE. + +To do so, follow the [Installing kube-arangodb](./README.md#installing-kube-arangodb) instructions. + +## Deploying your first ArangoDB database + +Once the ArangoDB Kubernetes operator has been installed and its `Pods` are in the `Ready` +state, you can launch your first ArangoDB deployment in your Kubernetes cluster +on GKE. + +To do so, follow the [Deploying your first ArangoDB database](./README.md#deploying-your-first-arangodb-database) instructions. + +Note that GKE supports `Services` of type `LoadBalancer`. diff --git a/Documentation/Books/Manual/Tutorials/Kubernetes/README.md b/Documentation/Books/Manual/Tutorials/Kubernetes/README.md index 42a75d4be2..e49d2a6200 100644 --- a/Documentation/Books/Manual/Tutorials/Kubernetes/README.md +++ b/Documentation/Books/Manual/Tutorials/Kubernetes/README.md @@ -1,4 +1,4 @@ - + # Start ArangoDB on Kubernetes in 5 minutes Starting an ArangoDB database (either single server or full blown cluster) @@ -38,7 +38,6 @@ For now, any recent Kubernetes cluster will do (e.g. `minikube`). Then run (replace `` with the version of the operator that you want to install): ```bash -kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb//manifests/crd.yaml kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb//manifests/arango-deployment.yaml # Optional kubectl apply -f https://raw.githubusercontent.com/arangodb/kube-arangodb//manifests/arango-storage.yaml diff --git a/Documentation/Books/Manual/Tutorials/Kubernetes/gke-clusters-added.png b/Documentation/Books/Manual/Tutorials/Kubernetes/gke-clusters-added.png new file mode 100644 index 0000000000000000000000000000000000000000..845a4449550e78b1949c6f6cb7812ac21776430c GIT binary patch literal 52380 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 A?*IS* literal 0 HcmV?d00001 diff --git a/Documentation/Books/Manual/Tutorials/Kubernetes/gke-clusters-ready.png b/Documentation/Books/Manual/Tutorials/Kubernetes/gke-clusters-ready.png new file mode 100644 index 0000000000000000000000000000000000000000..7ecf21fd81c15a20c487c2d1f7e21196ba8c7b13 GIT binary patch literal 53732 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%0Dj@Q(r%PaFl8peC}HZSJ- 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 H*zf-V`>YzQ literal 0 HcmV?d00001 diff --git a/Documentation/Books/Manual/Tutorials/Kubernetes/gke-clusters.png b/Documentation/Books/Manual/Tutorials/Kubernetes/gke-clusters.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9a033bf51e6f749b2dfd1fc2f1fa2ba4a3a2fb GIT binary patch literal 49759 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≈WAa9OdX|JA(kt`O3Lbii#k@DU@Sgfy{h+u@^1ql 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
  • vnsia)w8bl5EOmtvZHo3s>?4utO@_ds>w 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 literal 0 HcmV?d00001 diff --git a/Documentation/Books/Manual/Tutorials/Kubernetes/gke-edit-cluster.png b/Documentation/Books/Manual/Tutorials/Kubernetes/gke-edit-cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..cd503e53ca534cd43e97f8ce404a4b94d91b08a7 GIT binary patch literal 53759 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ɚ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%0DAj7?R3-v@+2A6rqEuurS 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 + # Starting an ArangoDB cluster or database the easy way Starting an ArangoDB cluster is complex. It involves starting various servers with diff --git a/Documentation/Scripts/fetchRefs.sh b/Documentation/Scripts/fetchRefs.sh index b4566b2709..13d85f8990 100755 --- a/Documentation/Scripts/fetchRefs.sh +++ b/Documentation/Scripts/fetchRefs.sh @@ -8,19 +8,19 @@ GITAUTH="$1" for book in ${ALLBOOKS}; do - repos=$(grep '^#' ../Books/${book}/SUMMARY.md |grep git |sed 's;# *;;') + repos=$(grep '^ *$;\1;') for oneRepo in ${repos}; do - export REPO=$(echo $oneRepo |cut -d ';' -f 1) - export CLONEDIR=$(echo $oneRepo |cut -d ';' -f 2) - export SUBDIR=$(echo $oneRepo |cut -d ';' -f 3) - export SRC=$(echo $oneRepo |cut -d ';' -f 4) - export DST=$(echo $oneRepo |cut -d ';' -f 5) + REPO=$(echo "$oneRepo" |cut -d ';' -f 1) + CLONEDIR=$(echo "$oneRepo" |cut -d ';' -f 2) + SUBDIR=$(echo "$oneRepo" |cut -d ';' -f 3) + SRC=$(echo "$oneRepo" |cut -d ';' -f 4) + DST=$(echo "$oneRepo" |cut -d ';' -f 5) - export CODIR="../Books/repos/${CLONEDIR}" - export AUTHREPO=$(echo "${REPO}" | sed "s;@;${GITAUTH}@;") + CODIR="../Books/repos/${CLONEDIR}" + AUTHREPO="${REPO/@/${GITAUTH}@}" if test -d "${CODIR}"; then ( cd "${CODIR}" @@ -34,7 +34,7 @@ for book in ${ALLBOOKS}; do fi # extract branch/tag/... for checkout from VERSIONS file - branch=$(cat ../../VERSIONS|grep "EXTERNAL_DOC_${CLONEDIR}=" | sed "s/^EXTERNAL_DOC_${CLONEDIR}=//") + branch=$(grep "EXTERNAL_DOC_${CLONEDIR}=" "../../VERSIONS" | sed "s/^EXTERNAL_DOC_${CLONEDIR}=//") if [ -z "${branch}" ]; then echo "no branch for ${CLONEDIR}, specify in VERSIONS file." @@ -45,19 +45,23 @@ for book in ${ALLBOOKS}; do (cd "${CODIR}" && git checkout "${branch}" && git pull) for oneMD in $(cd "${CODIR}/${SUBDIR}"; find "./${SRC}" -type f |sed "s;\./;;"); do - export oneMD - export NAME=$(basename ${oneMD}) - export MDSUBDIR=$(echo "${oneMD}" | sed "s;${NAME};;") - export DSTDIR="../Books/${book}/${DST}/${MDSUBDIR}" - export TOPREF=$(echo ${MDSUBDIR} | sed 's;\([a-zA-Z]*\)/;../;g') + NAME=$(basename "${oneMD}") + MDSUBDIR="${oneMD/${NAME}/}" + DSTDIR="../Books/${book}/${DST}/${MDSUBDIR}" + TOPREF=$(echo "${MDSUBDIR}" | sed 's;\([a-zA-Z]*\)/;../;g') if test ! -d "${DSTDIR}"; then mkdir -p "${DSTDIR}" fi - ( - echo "" - cat "${CODIR}/${SUBDIR}/${SRC}/${oneMD}" |sed "s;https://docs.arangodb.com/latest;../${TOPREF};g" - ) > "${DSTDIR}/${NAME}" - + sourcefile="${CODIR}/${SUBDIR}/${SRC}/${oneMD}" + targetfile="${DSTDIR}/${NAME}" + if [[ "$sourcefile" == *.md ]]; then + ( + echo "" + sed "s;https://docs.arangodb.com/latest;../${TOPREF};g" "$sourcefile" + ) > "$targetfile" + else + cp "$sourcefile" "$targetfile" + fi done done done
  • arangodb-java-driverArangoDBnetwork protocolJava version
    5.x.x+3.0.0+VelocyStream, HTTP1.6+
    4.2.x+3.0.0+VelocyStream, HTTP1.6+
    4.1.x3.1.0+VelocyStream1.6+
    3.1.x3.1.0+HTTP1.6+